Effect.ts: Absence as First-Class

ConcurrencyLesson 9 of 51

9. HOW #4: Racing

Multiple ways to resolve absence - use whoever finishes first

Code Example
const primary = Effect.gen(function* () {
  yield* Effect.sleep("2 seconds");
  return "Primary DB";
});

const backup = Effect.gen(function* () {
  yield* Effect.sleep("100 millis");
  return "Backup DB";
});

const fastest = Effect.race(primary, backup);
// Result: "Backup DB" (it's faster)
Interactive Example
const primary = Effect.gen(function* () {
      yield* Effect.sleep('200 millis');
      return 'Primary DB';
});
const backup = Effect.gen(function* () {
      yield* Effect.sleep('50 millis');
      return 'Backup DB';
});
const start = Date.now();
const fastest = Effect.race(primary, backup);
const result = await Effect.runPromise(fastest);
const elapsed = Date.now() - start;
return `Race complete!

Primary: 200ms
Backup: 50ms
Winner: "${result}" (${elapsed}ms)

✓ Fastest source wins!`;
Explanation

Race: resolving absence from multiple sources.

Traditional approach: pick one source, hope it's available. Effect types unavailability with multiple resolution paths:

  • Data is unavailable in multiple places
  • Describe: "Try both, use whichever becomes available first"
  • No assumptions: we don't assume primary is faster or more reliable

This is absence-first thinking: multiple HOWs to get the same WHAT!


Part 9 of 51 in the Effect.ts Absence Modeling series