Cause
Records the full reason an Effect failed.
A Cause<E> can contain typed failures, unexpected defects, interruptions, and annotations. Keeping those details together lets code inspect or format failures without first collapsing them to a single error value. This module includes the Cause and Reason data types, helpers for building and checking causes, and small error types used by several Effect APIs.
Annotations
Signature
declare const annotate: {
(
annotations: Context<never>,
options?: {
readonly overwrite?: boolean;
},
): <E>(self: Cause<E>) => Cause<E>;
<E>(
self: Cause<E>,
annotations: Context<never>,
options?: {
readonly overwrite?: boolean;
},
): Cause<E>;
};annotations
Reads the merged annotations from all reasons in a Cause.
When to use
Use to read diagnostic metadata merged from the whole cause.
Gotchas
When multiple reasons contain the same annotation key, the value from the later reason wins.
See
reasonAnnotationsโ annotations from a single reason
Signature
declare const annotations: <E>(self: Cause<E>) => Context.Context<never>;reasonAnnotations
Reads the annotations from a single Reason as a Context.
When to use
Use when you need tracing metadata (e.g. StackTrace) from a specific reason rather than the whole cause.
See
annotationsโ merged annotations from all reasons in a cause
Signature
declare const reasonAnnotations: <E>(self: Reason<E>) => Context.Context<never>;Combining
Merges two causes into a single cause whose reasons array is the union of both inputs (de-duplicated by value equality).
When to use
Use to merge independent causes into one structured failure value.
Details
- Combining with empty returns the other cause unchanged. - If the result is structurally equal to self, self is returned (referential shortcut).
See
fromReasonsโ build a cause from an array of reasonsemptyfor the identity cause used when combining
Signature
declare const combine: {
<E2>(that: Cause<E2>): <E>(self: Cause<E>) => Cause<E2 | E>;
<E, E2>(self: Cause<E>, that: Cause<E2>): Cause<E | E2>;
};Constructors
AsyncFiberError
Constructs an AsyncFiberError for a fiber that could not be resolved synchronously.
When to use
Use to create the error value for a fiber that could not be completed by a synchronous runner.
See
isAsyncFiberErrorfor checking unknown values
Signature
declare const AsyncFiberError: (fiber: Fiber<unknown, unknown>) => AsyncFiberError;Creates a Cause containing a single Die reason with the given defect.
When to use
Use to construct a cause from an untyped defect or unexpected thrown value.
See
Signature
declare const die: (defect: unknown) => Cause<never>;Creates an Effect that fails with a Done error. Shorthand for Effect.fail(Cause.Done(value)).
When to use
Use when you model stream or queue completion through the error channel.
See
Doneโ create the signal value without an Effect
Signature
declare const done: <A = void>(value?: A) => Effect.Effect<never, Done<A>>;Creates a Done signal with an optional value.
When to use
Use when you need to construct a low-level pull completion signal directly.
See
doneโ create a failingEffectwithDone
Signature
declare const Done: <A = void>(value?: A) => Done<A>;Represents a Cause with an empty reasons array.
When to use
Use to represent the absence of failure when constructing or combining causes.
Details
Represents the absence of failure. Combining any cause with empty via combine returns the original cause unchanged.
See
combinefor merging causes whereemptyacts as the identity
Signature
declare const empty: Cause<never>;ExceededCapacityError
Constructs an ExceededCapacityError with an optional message.
When to use
Use to create the error value for bounded-resource capacity failures.
See
isExceededCapacityErrorfor checking unknown values
Signature
declare const ExceededCapacityError: (message?: string) => ExceededCapacityError;Creates a Cause containing a single Fail reason with the given typed error.
When to use
Use to construct a cause from an expected typed error.
See
Signature
declare const fail: <E>(error: E) => Cause<E>;fromReasons
Creates a Cause from an array of Reason values.
When to use
Use when you already have individual reasons (e.g. from filtering or transforming another cause's reasons array) and need to wrap them back into a Cause.
Details
- Returns a new Cause. - An empty array produces a cause equivalent to empty.
Gotchas
The reasons array is stored as provided. Treat the array as immutable after passing it to this function.
See
combineโ merge two existing causes
Signature
declare const fromReasons: <E>(reasons: ReadonlyArray<Reason<E>>) => Cause<E>;IllegalArgumentError
Constructs an IllegalArgumentError with an optional message.
Signature
declare const IllegalArgumentError: (message?: string) => IllegalArgumentError;Creates a Cause containing a single Interrupt reason, optionally carrying the interrupting fiber's ID.
See
Signature
declare const interrupt: (fiberId?: number) => Cause<never>;makeDieReason
Creates a standalone Die reason (not wrapped in a Cause).
When to use
Use when constructing a standalone defect reason for fromReasons or direct comparison.
See
makeFailReasonโ create aFailreasonmakeInterruptReasonโ create anInterruptreason
Signature
declare function makeDieReason(defect: unknown): Die;makeFailReason
Creates a standalone Fail reason (not wrapped in a Cause).
When to use
Use when constructing a standalone typed failure reason for fromReasons or direct comparison.
See
makeDieReasonโ create aDiereasonmakeInterruptReasonโ create anInterruptreason
Signature
declare function makeFailReason<E>(error: E): Fail<E>;makeInterruptReason
Creates a standalone Interrupt reason (not wrapped in a Cause), optionally carrying the interrupting fiber's ID.
When to use
Use when constructing a standalone interrupt reason for fromReasons or direct comparison.
See
makeFailReasonโ create aFailreasonmakeDieReasonโ create aDiereason
Signature
declare const makeInterruptReason: (fiberId?: number) => Interrupt;NoSuchElementError
Constructs a NoSuchElementError with an optional message.
When to use
Use to create the error value for APIs that intentionally fail when an expected element is absent.
See
isNoSuchElementErrorfor checking unknown values
Signature
declare const NoSuchElementError: (message?: string) => NoSuchElementError;TimeoutError
Constructs a TimeoutError with an optional message.
Signature
declare const TimeoutError: (message?: string) => TimeoutError;UnknownError
Constructs an UnknownError. The first argument is the original cause (stored in Error.cause); the second is an optional human-readable message.
Signature
declare const UnknownError: (cause: unknown, message?: string) => UnknownError;Destructors
Collapses a Cause into a single unknown value, picking the "most important" failure in this order:
When to use
Use to collapse a structured cause to the single value that synchronous and promise runners would throw.
Details
1. First Fail error (the E value) 2. First Die defect 3. A generic Error("All fibers interrupted without error") for interrupt-only causes 4. A generic Error("Empty cause") for empty
This is the function used by Effect.runPromise and Effect.runSync to decide what to throw.
Gotchas
This function is lossy. Use prettyErrors or iterate cause.reasons when you need all failures.
See
prettyErrorsโ non-lossy conversion toArray<Error>prettyโ human-readable string rendering
Signature
declare const squash: <E>(self: Cause<E>) => unknown;Errors
AsyncFiberError interface
An error that occurs when trying to run an async fiber with Effect.runSync.
When to use
Use to inspect failures produced when synchronous runners encounter an effect that cannot complete synchronously.
Details
The fiber property stores the fiber that could not be synchronously resolved. This error implements YieldableError.
Signature
interface AsyncFiberError extends YieldableError {
readonly _tag: "AsyncFiberError";
readonly "~effect/Cause/AsyncFiberError": "~effect/Cause/AsyncFiberError";
readonly fiber: Fiber<unknown, unknown>;
}A graceful completion signal for queues and streams.
When to use
Use to model normal producer completion through a stream or queue error channel.
Details
Done indicates that a producer has finished normally โ no more elements will arrive. It is distinct from an error or interruption; it represents successful completion. The optional value field can carry a final leftover payload.
Signature
interface Done<A = void> {
readonly _tag: "Done";
readonly "~effect/Cause/Done": "~effect/Cause/Done";
readonly value: A;
}ExceededCapacityError interface
An error indicating that a bounded resource (queue, pool, semaphore, etc.) has exceeded its capacity.
When to use
Use to model bounded-resource failures where an operation cannot proceed because capacity has been exhausted.
Details
Implements YieldableError.
Signature
interface ExceededCapacityError extends YieldableError {
readonly _tag: "ExceededCapacityError";
readonly "~effect/Cause/ExceededCapacityError": "~effect/Cause/ExceededCapacityError";
}IllegalArgumentError interface
An error indicating that a function received an argument that violates its contract (e.g. negative where positive was expected).
Details
Implements YieldableError.
Signature
interface IllegalArgumentError extends YieldableError {
readonly _tag: "IllegalArgumentError";
readonly "~effect/Cause/IllegalArgumentError": "~effect/Cause/IllegalArgumentError";
}NoSuchElementError interface
An error indicating that an expected value was absent.
When to use
Use to model APIs that intentionally turn absence into an error.
Details
Used by APIs that convert absence into an exception or effect failure, such as Option.getOrThrow. Implements YieldableError so it can be yielded directly in Effect.gen.
Gotchas
Prefer APIs that return Option or a typed failure when absence is an expected case. This error is mainly for APIs that intentionally turn absence into a thrown value or failed effect.
Signature
interface NoSuchElementError extends YieldableError {
readonly _tag: "NoSuchElementError";
readonly "~effect/Cause/NoSuchElementError": "~effect/Cause/NoSuchElementError";
}TimeoutError interface
An error indicating that an operation exceeded its time limit.
Details
Produced by Effect.timeout and related APIs. Implements YieldableError.
Signature
interface TimeoutError extends YieldableError {
readonly _tag: "TimeoutError";
readonly "~effect/Cause/TimeoutError": "~effect/Cause/TimeoutError";
}UnknownError interface
A wrapper for errors whose type is not statically known.
Details
Used when a thrown or rejected value is not represented by a more specific typed error. The original value is stored in the cause property inherited from Error. Implements YieldableError.
Signature
interface UnknownError extends YieldableError {
readonly _tag: "UnknownError";
readonly "~effect/Cause/UnknownError": "~effect/Cause/UnknownError";
}YieldableError interface
Base interface for error classes that can be yielded directly inside Effect.gen. Yielding one of these errors fails the generator with that error as the typed failure value.
Details
All built-in error classes in this module (NoSuchElementError, TimeoutError, IllegalArgumentError, ExceededCapacityError, AsyncFiberError, and UnknownError) implement this interface.
Signature
interface YieldableError extends Error, Pipeable, Inspectable {
readonly "~effect/Effect": Variance<never, YieldableError, never>;
[iterator](): EffectIterator<Effect<never, YieldableError, never>>;
}Filtering
filterInterruptors
Returns a Result whose success value is the set of defined fiber IDs from the cause's Interrupt reasons. If the cause has no Interrupt reason, the failure value is the original cause.
When to use
Use when you need absence of interrupt reasons to fail with the original cause.
Gotchas
Interrupt reasons without a fiberId still count as interrupts, so the function succeeds with an empty Set when every interrupt reason has an undefined fiber ID.
See
interruptorsโ always-succeeding variant
Signature
declare const filterInterruptors: <E>(self: Cause<E>) => Result.Result<Set<number>, Cause<E>>;findDefect
Returns a Result whose success value is the first defect value from a Die reason in the cause. If the cause has no Die reason, the failure value is the original cause.
When to use
Use when you need the first defect value from a Cause as a Result, without the full Die reason.
See
Signature
declare const findDefect: <E>(self: Cause<E>) => Result.Result<unknown, Cause<E>>;Returns a Result whose success value is the first Die reason in the cause, including its annotations. If the cause has no Die reason, the failure value is the original cause.
When to use
Use when you need the full Die reason from a Cause, including annotations.
See
findDefectโ extract the unwrapped defect valuefindFailโ extract the firstFailreason
Signature
declare const findDie: <E>(self: Cause<E>) => Result.Result<Die, Cause<E>>;Returns a Result whose success value is the first typed error value E from a Fail reason in the cause. If the cause has no Fail reason, the failure value is the original cause narrowed to Cause<never>, because it contains no typed error reasons.
When to use
Use when you need the first typed error value from a Cause as a Result that preserves the original cause when no match is found.
See
findFailโ extract the fullFailreasonfindErrorOptionโOption-based variant
Signature
declare const findError: <E>(self: Cause<E>) => Result.Result<E, Cause<never>>;findErrorOption
Returns the first typed error value E from a cause wrapped in Option.some, or Option.none if no Fail reason exists.
When to use
Use when you need the first typed error value from a Cause as an Option, discarding the original cause.
See
findErrorโResult-based variant
Signature
declare const findErrorOption: <E>(input: Cause<E>) => Option<E>;Returns a Result whose success value is the first Fail reason in the cause, including its annotations. If the cause has no Fail reason, the failure value is the original cause narrowed to Cause<never>, because it contains no typed error reasons.
When to use
Use when you need the full Fail reason from a Cause, including annotations.
See
Signature
declare const findFail: <E>(self: Cause<E>) => Result.Result<Fail<E>, Cause<never>>;findInterrupt
Returns a Result whose success value is the first Interrupt reason in the cause, including its annotations. If the cause has no Interrupt reason, the failure value is the original cause.
When to use
Use when you need the first Interrupt reason from a Cause, including the fiber ID and annotations.
See
interruptorsโ collect all interrupting fiber IDs as aSet
Signature
declare const findInterrupt: <E>(self: Cause<E>) => Result.Result<Interrupt, Cause<E>>;Formatting
Formats a Cause as a human-readable string for logging or debugging.
When to use
Use to render a whole cause as one human-readable string for logs or diagnostics.
Details
Delegates to prettyErrors to convert each reason to an Error, then joins their stack traces with newlines. Nested Error.cause chains are rendered inline with indentation:
``text ErrorName: message at ... at ... { [cause]: NestedError: message at ... } ``
Span annotations are appended to the relevant stack frames when available.
Gotchas
Rendering an empty cause produces an empty string because there are no errors to render.
See
prettyErrorsโ get the individualErrorinstances
Signature
declare const pretty: <E>(cause: Cause<E>) => string;prettyErrors
Converts a Cause into an Array<Error> suitable for logging or rethrowing.
When to use
Use to convert every renderable failure in a cause into individual Error values before logging or rethrowing.
Details
Each Fail and Die reason is converted into a standard Error:
- Objects / Error instances โ message, name, stack, and cause are preserved. Extra enumerable properties are copied. Stack traces are cleaned up and enriched with span annotations when available. - Strings โ used directly as the Error message. - Other primitives (null, undefined, numbers, โฆ) โ wrapped in an Error with message "Unknown error: <value>".
Interrupt reasons are collected separately. If the cause contains only interrupts (no Fail or Die), a single InterruptError is returned whose cause lists the interrupting fiber IDs.
An empty cause returns an empty array.
See
Signature
declare const prettyErrors: <E>(
self: Cause<E>,
options?: {
readonly includeCauseInStack?: boolean;
},
) => Array<Error>;Getters
interruptors
Collects the defined fiber IDs from all Interrupt reasons in the cause into a ReadonlySet. Interrupt reasons without a fiberId are ignored. Returns an empty set when the cause has no interrupting fiber IDs.
When to use
Use when you need interrupting fiber IDs as a set, with absence represented as an empty set.
See
filterInterruptorsโResult-based variant
Signature
declare const interruptors: <E>(self: Cause<E>) => ReadonlySet<number>;Guards
isAsyncFiberError
Checks whether an arbitrary value is an AsyncFiberError.
Signature
declare const isAsyncFiberError: (u: unknown) => u is AsyncFiberError;Checks whether an arbitrary value is a Cause.
Signature
declare const isCause: (self: unknown) => self is Cause<unknown>;isDieReason
Narrows a Reason to Die.
When to use
Use as a predicate for Array.filter to pick out Die (defect) reasons when iterating over cause.reasons.
See
isFailReasonโ narrow toFailisInterruptReasonโ narrow toInterrupt
Signature
declare const isDieReason: <E>(self: Reason<E>) => self is Die;Checks whether an arbitrary value is a Done signal.
Signature
declare const isDone: (u: unknown) => u is Done<any>;isExceededCapacityError
Checks whether an arbitrary value is an ExceededCapacityError.
Signature
declare const isExceededCapacityError: (u: unknown) => u is ExceededCapacityError;isFailReason
Narrows a Reason to Fail.
When to use
Use as a predicate for Array.filter to pick out typed Fail reasons when iterating over cause.reasons.
See
isDieReasonโ narrow toDieisInterruptReasonโ narrow toInterrupt
Signature
declare const isFailReason: <E>(self: Reason<E>) => self is Fail<E>;isIllegalArgumentError
Checks whether an arbitrary value is an IllegalArgumentError.
Signature
declare const isIllegalArgumentError: (u: unknown) => u is IllegalArgumentError;isInterruptReason
Narrows a Reason to Interrupt.
When to use
Use as a predicate for Array.filter to pick out Interrupt reasons when iterating over cause.reasons.
See
isFailReasonโ narrow toFailisDieReasonโ narrow toDie
Signature
declare const isInterruptReason: <E>(self: Reason<E>) => self is Interrupt;isNoSuchElementError
Checks whether an arbitrary value is a NoSuchElementError.
Signature
declare const isNoSuchElementError: (u: unknown) => u is NoSuchElementError;Checks whether an arbitrary value is a Reason (Fail, Die, or Interrupt).
Signature
declare const isReason: (self: unknown) => self is Reason<unknown>;isTimeoutError
Checks whether an arbitrary value is a TimeoutError.
Signature
declare const isTimeoutError: (u: unknown) => u is TimeoutError;isUnknownError
Checks whether an arbitrary value is an UnknownError.
Signature
declare const isUnknownError: (u: unknown) => u is UnknownError;Mapping
Transforms the typed error values inside a Cause using the provided function. Only Fail reasons are affected; Die and Interrupt reasons pass through unchanged.
When to use
Use to transform expected typed failures while preserving defects and interruptions unchanged.
Details
If at least one Fail reason exists, this returns a new Cause containing the mapped failures. If the cause has no Fail reasons, the original cause is returned unchanged.
Signature
declare const map: {
<E, E2>(f: (error: NoInfer<E>) => E2): (self: Cause<E>) => Cause<E2>;
<E, E2>(self: Cause<E>, f: (error: NoInfer<E>) => E2): Cause<E2>;
};Models
A structured representation of how an Effect failed.
When to use
Use to preserve the full structured failure information for an effect instead of collapsing it to a single error value.
Details
Access the individual failure entries through the reasons array, then narrow each entry with isFailReason, isDieReason, or isInterruptReason.
- Use hasFails / hasDies / hasInterrupts to test for the presence of specific reason kinds without iterating. - Use findError / findDefect to extract the first value of a given kind. - Use combine to merge two causes.
Cause implements Equal โ two causes with the same reasons (by value) compare as equal.
Signature
interface Cause<out E> extends Pipeable, Inspectable, Equal {
readonly "~effect/Cause": "~effect/Cause";
readonly reasons: readonly Array<Reason<E>>;
}An untyped defect โ typically a programming error or an uncaught exception.
When to use
Use when inspecting Cause reasons that represent defects instead of typed failures or interruptions.
Details
The defect property is unknown because defects are not part of the typed error channel. Use isDieReason to narrow a Reason to this type.
See
diefor constructing a cause with a singleDiereasonisDieReasonfor narrowing aReasontoDie
Signature
interface Die extends ReasonProto<"Die"> {
readonly defect: unknown;
}A typed, expected error produced by Effect.fail.
When to use
Use when inspecting Cause reasons that represent expected failures from the typed error channel.
Details
The error property carries the typed value E. Use isFailReason to narrow a Reason to this type.
See
failfor constructing a cause with a singleFailreasonisFailReasonfor narrowing aReasontoFail
Signature
interface Fail<out E> extends ReasonProto<"Fail"> {
readonly error: E;
}A fiber interruption signal, optionally carrying the ID of the fiber that initiated the interruption.
Details
Use isInterruptReason to narrow a Reason to this type.
Signature
interface Interrupt extends ReasonProto<"Interrupt"> {
readonly fiberId: number | undefined;
}A single entry inside a Cause's reasons array.
Details
Narrow to a concrete type with isFailReason, isDieReason, or isInterruptReason.
- Fail<E> โ typed error, access via .error - Die โ untyped defect, access via .defect - Interrupt โ fiber interruption, access via .fiberId
Every reason carries an annotations map and an annotate method for attaching tracing metadata.
Signature
type Reason<E> = Fail<E> | Die | Interrupt;Other
Predicates
Returns true if the cause contains at least one Die reason.
When to use
Use to check whether a cause includes defects before extracting or rendering them.
See
hasFailsโ check for typed errorshasInterruptsโ check for interruptions
Signature
declare const hasDies: <E>(self: Cause<E>) => boolean;Returns true if the cause contains at least one Fail reason.
When to use
Use to check whether a cause includes typed failures before extracting, mapping, or rendering them.
See
hasDiesโ check for defectshasInterruptsโ check for interruptions
Signature
declare const hasFails: <E>(self: Cause<E>) => boolean;hasInterrupts
Returns true if the cause contains at least one Interrupt reason.
See
hasInterruptsOnlyโtrueonly when *all* reasons are interruptshasFailsโ check for typed errorshasDiesโ check for defects
Signature
declare const hasInterrupts: <E>(self: Cause<E>) => boolean;hasInterruptsOnly
Returns true if every reason in the cause is an Interrupt (and there is at least one reason).
When to use
Use when you need to detect failures caused only by interruption.
See
hasInterruptsโtrueif the cause contains *any* interrupts
Signature
declare const hasInterruptsOnly: <E>(self: Cause<E>) => boolean;Services
InterruptorStackTrace
Context annotation used to store the stack frame captured at the point of interruption.
When to use
Use when you need the stack-frame annotation used by interrupt-only cause rendering.
Details
Similar to StackTrace but specific to Interrupt reasons.
See
StackTracefor stack frames attached to failuresreasonAnnotationsfor reading annotations from a single reasonannotatefor attaching annotations to a cause
Signature
declare class InterruptorStackTrace extends Shape<
"effect/Cause/InterruptorStackTrace",
StackFrame,
this
> {
constructor(_: never);
}StackTrace
Context annotation used to store the stack frame captured at the point of failure.
When to use
Use to read the failure stack-frame annotation from a Reason when building diagnostics, logging, or custom cause renderers.
Details
The runtime annotates every reason with this when a stack frame is available. Retrieve it via Context.get(Cause.reasonAnnotations(reason), Cause.StackTrace).
See
reasonAnnotationsfor reading annotations from a single reasonannotationsfor reading merged annotations from a causeInterruptorStackTracefor the interrupt-specific stack-frame annotation
Signature
declare class StackTrace extends Shape<"effect/Cause/StackTrace", StackFrame, this> {
constructor(_: never);
}Type IDs
AsyncFiberErrorTypeId
Unique brand present on AsyncFiberError values and used by isAsyncFiberError for runtime checks.
Signature
declare const AsyncFiberErrorTypeId: "~effect/Cause/AsyncFiberError";DoneTypeId
Unique brand for Done values.
Signature
declare const DoneTypeId: "~effect/Cause/Done";ExceededCapacityErrorTypeId
Unique brand for ExceededCapacityError.
Signature
declare const ExceededCapacityErrorTypeId: "~effect/Cause/ExceededCapacityError";IllegalArgumentErrorTypeId
Unique brand for IllegalArgumentError.
Signature
declare const IllegalArgumentErrorTypeId: "~effect/Cause/IllegalArgumentError";NoSuchElementErrorTypeId
Unique brand for NoSuchElementError.
Signature
declare const NoSuchElementErrorTypeId: "~effect/Cause/NoSuchElementError";ReasonTypeId
Unique brand for Reason values, used for runtime type checks via isReason.
Signature
declare const ReasonTypeId: "~effect/Cause/Reason";TimeoutErrorTypeId
Unique brand for TimeoutError.
Signature
declare const TimeoutErrorTypeId: "~effect/Cause/TimeoutError";Unique brand for Cause values, used for runtime type checks via isCause.
Signature
declare const TypeId: "~effect/Cause";UnknownErrorTypeId
Unique brand for UnknownError.
Signature
declare const UnknownErrorTypeId: "~effect/Cause/UnknownError";
Attaches metadata to every reason in a
Cause.When to use
Use to attach diagnostic metadata to every reason in a cause.
Details
Annotations are stored as a
Contexton each reason and can be retrieved later via reasonAnnotations or annotations. The runtime uses this to attach stack traces and spans.- Returns a new
Cause. - By default, existing keys are preserved. Pass{ overwrite: true }to replace them.See
annotationsfor reading merged annotations from a causereasonAnnotationsfor reading annotations from a single reason