Deferred
One-time coordination cells for Effect programs. A Deferred<A, E> starts empty, can be completed exactly once with a success, failure, defect, or interruption, and lets any number of fibers wait for that result. Awaiting a Deferred suspends the fiber instead of blocking an operating-system thread, and every waiter observes the same completion.
Completion
Signature
declare const complete: {
<A, E, R>(effect: Effect<A, E, R>): (self: Deferred<A, E>) => Effect<boolean, never, R>;
<A, E, R>(self: Deferred<A, E>, effect: Effect<A, E, R>): Effect<boolean, never, R>;
};completeWith
Attempts to complete the Deferred with the specified effect directly.
When to use
Use to store an already environment-free effect as the completion without running it during completion.
Details
The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
Gotchas
The supplied effect is not memoized by completeWith; each awaiter may run the stored effect independently.
See
Signature
declare const completeWith: {
<A, E>(effect: Effect<A, E>): (self: Deferred<A, E>) => Effect<boolean>;
<A, E>(self: Deferred<A, E>, effect: Effect<A, E>): Effect<boolean>;
};Attempts to complete the Deferred with a defect.
When to use
Use to complete a Deferred with an unexpected defect.
Details
Fibers waiting on the Deferred die with that defect only if this call completes it. The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
Signature
declare const die: {
(defect: unknown): <A, E>(self: Deferred<A, E>) => Effect<boolean>;
<A, E>(self: Deferred<A, E>, defect: unknown): Effect<boolean>;
};Computes a defect when the returned effect is run, then attempts to complete the Deferred with that defect.
When to use
Use to lazily compute an unexpected defect when the completion effect runs.
Details
Fibers waiting on the Deferred die with the computed defect only if this call completes it. The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
Signature
declare const dieSync: {
(evaluate: LazyArg<unknown>): <A, E>(self: Deferred<A, E>) => Effect<boolean>;
<A, E>(self: Deferred<A, E>, evaluate: LazyArg<unknown>): Effect<boolean>;
};Completes the Deferred with the specified Exit value, which will be propagated to all fibers waiting on the value of the Deferred.
When to use
Use to complete a Deferred from an already computed Exit.
Details
The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
See
completefor completing from an effect and memoizing its resultcompleteWithfor storing an effect directlysucceedfor completing with a success valuefailCausefor completing with a failure cause
Signature
declare const done: {
<A, E>(exit: Exit<A, E>): (self: Deferred<A, E>) => Effect<boolean>;
<A, E>(self: Deferred<A, E>, exit: Exit<A, E>): Effect<boolean>;
};Attempts to complete the Deferred with the specified error.
When to use
Use to complete a Deferred with a typed failure value.
Details
Fibers waiting on the Deferred fail with that error only if this call completes it. The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
Signature
declare const fail: {
<E>(error: E): <A>(self: Deferred<A, E>) => Effect<boolean>;
<A, E>(self: Deferred<A, E>, error: E): Effect<boolean>;
};Attempts to complete the Deferred with the specified Cause.
When to use
Use to complete a Deferred with a full failure cause.
Details
Fibers waiting on the Deferred observe that cause only if this call completes it. The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
Signature
declare const failCause: {
<E>(cause: Cause<E>): <A>(self: Deferred<A, E>) => Effect<boolean>;
<A, E>(self: Deferred<A, E>, cause: Cause<E>): Effect<boolean>;
};failCauseSync
Computes a Cause when the returned effect is run, then attempts to complete the Deferred with that cause.
When to use
Use to lazily compute a full failure cause when the Deferred completion effect runs.
Details
Fibers waiting on the Deferred observe the computed cause only if this call completes it. The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
Signature
declare const failCauseSync: {
<E>(evaluate: LazyArg<Cause<E>>): <A>(self: Deferred<A, E>) => Effect<boolean>;
<A, E>(self: Deferred<A, E>, evaluate: LazyArg<Cause<E>>): Effect<boolean>;
};Computes an error when the returned effect is run, then attempts to complete the Deferred with that error.
When to use
Use to lazily compute a typed failure value when the Deferred completion effect runs.
Details
Fibers waiting on the Deferred fail with the computed error only if this call completes it. The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
Signature
declare const failSync: {
<E>(evaluate: LazyArg<E>): <A>(self: Deferred<A, E>) => Effect<boolean>;
<A, E>(self: Deferred<A, E>, evaluate: LazyArg<E>): Effect<boolean>;
};Attempts to complete the Deferred with interruption by the current fiber.
When to use
Use to complete a Deferred as interrupted by the current fiber.
Details
Fibers waiting on the Deferred are interrupted with the current fiber id only if this call completes it. The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
Signature
declare function interrupt<A, E>(self: Deferred<A, E>): Effect<boolean>;interruptWith
Attempts to complete the Deferred with interruption by the specified FiberId.
When to use
Use to complete a Deferred as interrupted by a specific fiber id.
Details
Fibers waiting on the Deferred are interrupted with that fiber id only if this call completes it. The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
Signature
declare const interruptWith: {
(fiberId: number): <A, E>(self: Deferred<A, E>) => Effect<boolean>;
<A, E>(self: Deferred<A, E>, fiberId: number): Effect<boolean>;
};Runs an Effect and attempts to complete a Deferred with the effect's result.
When to use
Use to pipe an effect result into a Deferred while preserving success, failure, defects, and interruption.
Details
If the effect succeeds, fails, dies, or is interrupted, that result is used as the attempted completion. The returned effect cannot fail; it succeeds with true if it completed the Deferred, or false if the Deferred was already completed.
Signature
declare const into: {
<A, E>(deferred: Deferred<A, E>): <R>(self: Effect<A, E, R>) => Effect<boolean, never, R>;
<A, E, R>(self: Effect<A, E, R>, deferred: Deferred<A, E>): Effect<boolean, never, R>;
};Attempts to complete the Deferred with the specified value.
When to use
Use to complete a Deferred with a successful value.
Details
Fibers waiting on the Deferred receive the value only if this call completes it. The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
Signature
declare const succeed: {
<A>(value: A): <E>(self: Deferred<A, E>) => Effect<boolean>;
<A, E>(self: Deferred<A, E>, value: A): Effect<boolean>;
};Computes a value when the returned effect is run, then attempts to complete the Deferred with that value.
When to use
Use to lazily compute a successful value when the Deferred completion effect runs.
Details
Fibers waiting on the Deferred receive the computed value only if this call completes it. The returned effect succeeds with true when this call completed the Deferred, or false if it was already completed.
Signature
declare const sync: {
<A>(evaluate: LazyArg<A>): <E>(self: Deferred<A, E>) => Effect<boolean>;
<A, E>(self: Deferred<A, E>, evaluate: LazyArg<A>): Effect<boolean>;
};Constructors
Getters
Returns the current completion effect as an Option. This returns Option.some(effect) when the Deferred is completed, Option.none() otherwise.
When to use
Use to inspect whether a Deferred is already completed and retrieve its stored completion effect when available.
Signature
declare function poll<A, E>(self: Deferred<A, E>): Effect<Option<Effect<A, E, never>>>;Guards
isDeferred
Checks whether a value is a Deferred.
When to use
Use to validate unknown values at runtime boundaries before treating them as Deferred values.
Signature
declare function isDeferred<A, E>(u: unknown): u is Deferred<A, E>;Models
A Deferred represents an asynchronous variable that can be set exactly once, with the ability for an arbitrary number of fibers to suspend (by calling Deferred.await) and automatically resume when the variable is set.
When to use
Use to coordinate multiple fibers around a value or failure that will be supplied exactly once.
Signature
interface Deferred<in out A, in out E = never> extends Variance<A, E>, Pipeable {
effect?: Effect<A, E, never>;
resumes?: Array<(effect: Effect<A, E>) => void>;
}Other
Predicates
Returns true if this Deferred has already been completed with a value or an error, false otherwise.
When to use
Use to check completion status inside an Effect workflow.
Signature
declare function isDone<A, E>(self: Deferred<A, E>): Effect<boolean>;isDoneUnsafe
Returns whether this Deferred has already been completed synchronously.
When to use
Use to check Deferred completion synchronously in code that cannot return an Effect, such as low-level integration code.
See
Signature
declare function isDoneUnsafe<A, E>(self: Deferred<A, E>): boolean;Unsafe
doneUnsafe
Attempts to complete the Deferred synchronously with the specified completion effect.
When to use
Use to complete a Deferred synchronously in low-level code that already has the completion effect.
Details
This mutates the Deferred directly and should be reserved for low-level code; prefer the effectful completion APIs when possible. Returns true if this call completed the Deferred, or false if it was already completed.
Signature
declare function doneUnsafe<A, E>(self: Deferred<A, E>, effect: Effect<A, E>): boolean;makeUnsafe
Creates an empty Deferred synchronously outside the Effect runtime.
When to use
Use to allocate a Deferred synchronously when direct allocation outside Effect is required.
Signature
declare function makeUnsafe<A, E = never>(): Deferred<A, E>;
Runs the supplied
Effectand attempts to complete theDeferredwith its memoized result.When to use
Use when completing a
Deferredshould run an effect once and share its result with all awaiters.Details
The returned effect succeeds with
truewhen this call completed theDeferred, orfalseif it was already completed.See
completeWithfor storing an effect directly without memoizing its result