Effect.ts: Absence as First-Class
Resources • Lesson 23 of 51
23. Deferred - Manual Promise
Deferred is a value that doesn't exist yet, and YOU decide when it exists
Code Example
const program = Effect.gen(function* () {
// Create a Deferred - an absent value
const deferred = yield* Deferred.make<number>();
// Start a fiber that will compute the value
yield* Effect.fork(
Effect.gen(function* () {
yield* Effect.sleep("2 seconds");
// NOW the value exists!
yield* Deferred.succeed(deferred, 42);
})
);
// Meanwhile, wait for it...
const result = yield* Deferred.await(deferred);
// Blocks until someone calls succeed()
return result;
});
// Like Promise, but better:
// - Type-safe
// - Interruptible
// - Composable with Effect
Interactive Example
const { Deferred } = await import('effect');
const deferred = await Effect.runPromise(Deferred.make());
Effect.runFork(
Effect.gen(function* () {
yield* Effect.sleep('50 millis');
yield* Deferred.succeed(deferred, 42);
})
);
const result = await Effect.runPromise(Deferred.await(deferred));
return `Deferred!
Created: Empty deferred
Waiting: (blocks...)
Filled after 50ms: ${result}
Manual promise control!`;
Explanation
Deferred: manually controlled absence.
Traditional approach: Promises auto-resolve from their executor. Deferred types explicit absence control:
- Create: "this value is absent"
- Succeed: "I'm making it available NOW"
- Await: "wait for someone to make it available"
- No assumptions about who/when/how it becomes available
Absence-first coordination: explicit control over when absence resolves!
Part 23 of 51 in the Effect.ts Absence Modeling series