Effect.ts: Absence as First-Class

ResourcesLesson 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