Effect.ts: Absence as First-Class
Concurrency • Lesson 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