Result
Models a value that has already succeeded or failed.
A Result<A, E> is Success<A, E> when a value is available and
Failure<A, E> when an error is available. It is plain data, so inspecting
or transforming it does not run side effects. This module includes helpers
for creating, checking, mapping, combining, and extracting results, plus
conversions to and from Option and nullable values.
Constructors
Provides the starting point for the "do notation" simulation with Result.
When to use
Use to start a Result do-notation pipeline from an empty successful record
before adding named fields from Result-producing computations and pure
computed values.
Details
Creates a Result<{}> (success with an empty object). Use with
bind to add Result-producing fields and let
to add pure computed fields.
See
Signature
declare const Do: Result<{}>Example
(Building an object step by step)
import { pipe, Result } from "effect"
pipe( Result.Do, Result.bind("x", () => Result.succeed(2)), Result.bind("y", () => Result.succeed(3)), Result.let("sum", ({ x, y }) => x + y)) // => Result.succeed({ x: 2, y: 3, sum: 5 })Creates a Result holding a Failure value.
When to use
Use to represent a failed Result with a typed failure value.
Details
- The success type
Adefaults tonever
See
Signature
declare const fail: <E>(left: E) => Result<never, E>Example
(Creating a failure)
import { Result } from "effect"
Result.fail("Something went wrong") // => Result.fail("Something went wrong")Provides a pre-built failed Result whose failure value is undefined.
When to use
Use when you need a failed Result value that acts only as a control signal
without failure data.
Details
This is equivalent to Result.fail(undefined) with type
Result<never, void>, but reuses a shared Failure wrapper instead of
allocating one each time.
See
- fail to create a Failure with a specific value
Signature
declare const failVoid: Result<never, void>Example
(Failing without a payload)
import { Result } from "effect"
Result.failVoid // => Result.fail(undefined)fromNullishOr
Converts a possibly null or undefined value into a Result.
When to use
Use when you need null or undefined input to become a Failure while
present values remain available as Success.
Details
- Non-nullish values become
Success<NonNullable<A>> nullorundefinedbecomesFailure<E>using the provided function- Supports both data-first and data-last (piped) usage
- The
onNullishcallback receives the original value
See
- fromOption to convert from an Option
- succeed / fail for direct construction
Signature
declare const fromNullishOr: { <A, E>(onNullish: (a: A) => E): (self: A) => Result<NonNullable<A>, E>; <A, E>(self: A, onNullish: (a: A) => E): Result<NonNullable<A>, E>;}Example
(Handling nullable values)
import { Result } from "effect"
Result.fromNullishOr(1, () => "fallback") // => Result.succeed(1)
Result.fromNullishOr(null, () => "fallback") // => Result.fail("fallback")fromOption
Converts an Option<A> into a Result<A, E>.
When to use
Use when an existing Option should become a Result, preserving Some as
success and turning None into a caller-provided failure.
Details
Some<A>becomesSuccess<A>NonebecomesFailure<E>using the provided function- Supports both data-first and data-last (piped) usage
See
- getSuccess to extract the success value as an Option
- getFailure to extract the failure value as an Option
- fromNullishOr to build a Result from nullable values
Signature
declare const fromOption: { <E>(onNone: () => E): <A>(self: Option<A>) => Result<A, E>; <A, E>(self: Option<A>, onNone: () => E): Result<A, E>;}Example
(Converting an Option to a Result)
import { Option, Result } from "effect"
Result.fromOption(Option.some(1), () => "missing") // => Result.succeed(1)
Result.fromOption(Option.none(), () => "missing") // => Result.fail("missing")liftPredicate
Lifts a value into a Result based on a predicate or refinement.
When to use
Use to construct a Result from a raw value guarded by a predicate or
refinement.
Details
- If the predicate returns
true, the value becomesSuccess<A> - If the predicate returns
false,orFailWithproduces the error forFailure<E> - Also accepts a
Refinementto narrow the success type - Supports both data-first and data-last (piped) usage
See
- filterOrFail to validate a value that is already in a
Result - fromNullishOr for nullable-based construction
Signature
declare const liftPredicate: { <A, B, E>(refinement: Refinement<A, B>, orFailWith: (a: A) => E): (a: A) => Result<B, E>; <B, E, A = B>(predicate: Predicate<A>, orFailWith: (a: A) => E): (a: B) => Result<B, E>; <A, E, B>(self: A, refinement: Refinement<A, B>, orFailWith: (a: A) => E): Result<B, E>; <B, E, A = B>(self: B, predicate: Predicate<A>, orFailWith: (a: A) => E): Result<B, E>;}Example
(Validating a number)
import { pipe, Result } from "effect"
pipe( 5, Result.liftPredicate( (n: number) => n > 0, (n) => `${n} is not positive` )) // => Result.succeed(5)Creates a Result holding a Success value.
Details
- Use when you have a value and want to lift it into the
Resulttype - The error type
Edefaults tonever
See
Signature
declare const succeed: <A>(right: A) => Result<A>Example
(Wrapping a value)
import { Result } from "effect"
Result.succeed(42) // => Result.succeed(42)succeedNone
Provides a pre-built Result<Option<never>> that succeeds with None.
When to use
Use when an optional success should be absent, such as the None branch of
transposeOption or transposeMapOption.
Details
This is equivalent to Result.succeed(Option.none()), but reuses a shared
Success wrapper instead of allocating one each time.
See
- succeedSome for the
Somecounterpart - transposeOption to transpose an Option that already contains a Result
- transposeMapOption to map and transpose an Option in one step
Signature
declare const succeedNone: Result<Option<never>, never>Example
(Succeeding with None)
import { Option, Result } from "effect"
Result.succeedNone // => Result.succeed(Option.none())succeedSome
Creates a Result<Option<A>> that succeeds with Some(a).
Details
- Equivalent to
Result.succeed(Option.some(a)) - Useful with transposeOption patterns
See
- succeedNone for the
Nonecounterpart
Signature
declare function succeedSome<A, E = never>(a: A): Result<Option<A>, E>Example
(Wrapping a value in Some inside a Result)
import { Option, Result } from "effect"
Result.succeedSome(42) // => Result.succeed(Option.some(42))Error Handling
Returns the original Result if it is a Success, otherwise applies
that to the error and returns the resulting Result.
When to use
Use when a failure should recover into another Result while keeping
successes unchanged.
Details
Success<A>is returned unchangedFailure<E>callsthat(e)to produce a newResult
See
Signature
declare const orElse: { <E, A2, E2>(that: (err: E) => Result<A2, E2>): <A>(self: Result<A, E>) => Result<A2 | A, E2>; <A, E, A2, E2>(self: Result<A, E>, that: (err: E) => Result<A2, E2>): Result<A | A2, E2>;}Example
(Recovering from a failure)
import { pipe, Result } from "effect"
pipe( Result.fail("primary failed"), Result.orElse(() => Result.succeed(99))) // => Result.succeed(99)Filtering
filterOrFail
Validates the success value of a Result using a predicate, failing with a
custom error if the predicate returns false.
When to use
Use to validate an already-successful Result value with a predicate or
refinement.
Details
- If the result is already a
Failure, it is returned as-is - If the predicate passes, the
Successis returned unchanged - If the predicate fails,
orFailWithproduces the error for a newFailure - Also accepts a
Refinementto narrow the success type - The error type of the output is the union of both error types
See
- liftPredicate to create a
Resultfrom a raw value with a predicate - flatMap for general conditional chaining
Signature
declare const filterOrFail: { <A, B, E2>(refinement: Refinement<NoInfer<A>, B>, orFailWith: (value: NoInfer<A>) => E2): <E>(self: Result<A, E>) => Result<B, E2 | E>; <A, E2>(predicate: Predicate<NoInfer<A>>, orFailWith: (value: NoInfer<A>) => E2): <E>(self: Result<A, E>) => Result<A, E2 | E>; <A, E, B, E2>(self: Result<A, E>, refinement: Refinement<A, B>, orFailWith: (value: A) => E2): Result<B, E | E2>; <A, E, E2>(self: Result<A, E>, predicate: Predicate<A>, orFailWith: (value: A) => E2): Result<A, E | E2>;}Example
(Filtering a success value)
import { pipe, Result } from "effect"
pipe( Result.succeed(0), Result.filterOrFail( (n) => n > 0, (n) => `${n} is not positive` )) // => Result.fail("0 is not positive")Generators
Provides generator-based syntax for composing Result values sequentially.
When to use
Use when you need generator syntax to compose sequential Result
computations instead of nested flatMap calls.
Details
- Use
yield*to unwrap aResultinside the generator; if any yieldedResultis aFailure, the generator short-circuits and returns that failure - The return value of the generator is wrapped in
Success - Evaluated eagerly and synchronously (unlike
Effect.gen)
See
Signature
declare const gen: Gen.Gen<ResultTypeLambda>Example
(Composing multiple Results)
import { Result } from "effect"
Result.gen(function*() { const a = yield* Result.succeed(1) const b = yield* Result.succeed(2) return a + b}) // => Result.succeed(3)ResultIterator interface
Iterator protocol used to yield a Result inside gen, returning the
success value type back to the generator.
When to use
Use when defining or typing [Symbol.iterator]() for Result values so
yield* can pass the success value type back into Result.gen.
See
- gen for writing generator-based
Resultcode that consumes this iterator protocol
Signature
interface ResultIterator<T extends Result<any, any>> { next(...args: readonly Array<any>): IteratorResult<T, Success<T>>;}Getters
getFailure
Extracts the failure value as an Option, discarding the success.
When to use
Use when you need to extract the failure value from a Result as an
Option and discard successful values.
Details
Failure<E>becomesSome<E>Success<A>becomesNone
See
- getSuccess to extract the success instead
- fromOption for the reverse conversion
Signature
declare const getFailure: <A, E>(self: Result<A, E>) => Option<E>Example
(Extracting the failure as an Option)
import { Option, Result } from "effect"
Result.getFailure(Result.succeed("ok")) // => Option.none()
Result.getFailure(Result.fail("err")) // => Option.some("err")Extracts the success value, or computes a fallback from the error.
When to use
Use when you need the success value from a Result, with a fallback computed
from the failure value.
Details
Success<A>returns the inner valueFailure<E>appliesonFailureto the error and returns the result- The return type is
A | A2(union of both branches)
See
- getOrNull / getOrUndefined for simpler fallbacks
- getOrThrow to throw on failure
- match to map both branches
- orElse to recover with another Result instead of unwrapping
Signature
declare const getOrElse: { <E, A2>(onFailure: (err: E) => A2): <A>(self: Result<A, E>) => A2 | A; <A, E, A2>(self: Result<A, E>, onFailure: (err: E) => A2): A | A2;}Example
(Providing a fallback)
import { Result } from "effect"
Result.getOrElse(Result.succeed(1), () => 0) // => 1
Result.getOrElse(Result.fail("err"), () => 0) // => 0Extracts the success value, or returns null on failure.
When to use
Use when you need to pass failed Result values to APIs that represent
absence as null.
Details
Success<A>returnsAFailure<E>returnsnull
See
- getOrUndefined to return
undefinedinstead - getOrElse for a custom fallback
Signature
declare const getOrNull: <A, E>(self: Result<A, E>) => A | nullExample
(Unwrapping to nullable)
import { Result } from "effect"
Result.getOrNull(Result.succeed(1)) // => 1
Result.getOrNull(Result.fail("err")) // => nullgetOrThrow
Extracts the success value or throws the raw failure value E.
When to use
Use when unchecked boundaries should turn failures into thrown exceptions.
Details
Success<A>returnsAFailure<E>throwsEdirectly- Use getOrThrowWith for a custom error object
See
- getOrThrowWith for custom error mapping
- getOrElse for a non-throwing alternative
Signature
declare const getOrThrow: <A, E>(self: Result<A, E>) => AExample
(Unwrapping or throwing)
import { Result } from "effect"
Result.getOrThrow(Result.succeed(1)) // => 1
const failure = Result.try(() => Result.getOrThrow(Result.fail("error")))Result.merge(failure) // => "error"getOrThrowWith
Extracts the success value or throws a custom error derived from the failure.
When to use
Use when converting a Result into a thrown exception with a custom error
message or error type.
Details
Success<A>returnsAFailure<E>throws the value returned byonFailure(e)
See
- getOrThrow to throw the raw failure value
- getOrElse for a non-throwing alternative
Signature
declare const getOrThrowWith: { <E>(onFailure: (err: E) => unknown): <A>(self: Result<A, E>) => A; <A, E>(self: Result<A, E>, onFailure: (err: E) => unknown): A;}Example
(Throwing a custom error)
import { Result } from "effect"
Result.getOrThrowWith(Result.succeed(1), () => new Error("fail")) // => 1
const failure = Result.try({ try: () => Result.getOrThrowWith( Result.fail("oops"), (error) => new Error(`Unexpected: ${error}`) ), catch: (error) => (error as Error).message})Result.merge(failure) // => "Unexpected: oops"getOrUndefined
Extracts the success value, or returns undefined on failure.
When to use
Use when you need to pass failed Result values to APIs that represent
absence as undefined.
Details
Success<A>returnsAFailure<E>returnsundefined
See
Signature
declare const getOrUndefined: <A, E>(self: Result<A, E>) => A | undefinedExample
(Unwrapping to optional)
import { Result } from "effect"
Result.getOrUndefined(Result.succeed(1)) // => 1
Result.getOrUndefined(Result.fail("err")) // => undefinedgetSuccess
Extracts the success value as an Option, discarding the failure.
When to use
Use when you need to extract the success value from a Result as an
Option and discard failure information.
Details
Success<A>becomesSome<A>Failure<E>becomesNone
See
- getFailure to extract the error instead
- fromOption for the reverse conversion
Signature
declare const getSuccess: <A, E>(self: Result<A, E>) => Option<A>Example
(Extracting the success as an Option)
import { Option, Result } from "effect"
Result.getSuccess(Result.succeed("ok")) // => Option.some("ok")
Result.getSuccess(Result.fail("err")) // => Option.none()Unwraps a Result into A | E by returning the inner value regardless
of whether it is a success or failure.
Details
Success<A>returnsAFailure<E>returnsE- Useful when both channels share a compatible type
See
Signature
declare const merge: <A, E>(self: Result<A, E>) => E | AExample
(Extracting the inner value)
import { Result } from "effect"
Result.merge(Result.succeed(42)) // => 42
Result.merge(Result.fail("error")) // => "error"Guards
Checks whether a Result is a Failure.
When to use
Use to narrow a known Result to the Failure variant.
Details
- Acts as a TypeScript type guard, narrowing to
Failure<A, E> - After narrowing, you can access
.failureto read the error value
See
Signature
declare const isFailure: <A, E>(self: Result<A, E>) => self is Failure<A, E>Example
(Narrowing to failure)
import { Result } from "effect"
const result = Result.fail("oops")
if (Result.isFailure(result)) { result.failure // => "oops"}Checks whether a value is a Result (either Success or Failure).
When to use
Use to validate unknown input before operating on it as a Result.
Details
- Returns
truefor bothSuccessandFailurevariants - Acts as a TypeScript type guard, narrowing to
Result<unknown, unknown>
See
Signature
declare const isResult: (input: unknown) => input is Result<unknown, unknown>Example
(Checking if a value is a Result)
import { Result } from "effect"
Result.isResult(Result.succeed(1)) // => true
Result.isResult({ value: 1 }) // => falseChecks whether a Result is a Success.
When to use
Use to narrow a known Result to the Success variant.
Details
- Acts as a TypeScript type guard, narrowing to
Success<A, E> - After narrowing, you can access
.successto read the value
See
Signature
declare const isSuccess: <A, E>(self: Result<A, E>) => self is Success<A, E>Example
(Narrowing to success)
import { Result } from "effect"
const result = Result.succeed(42)
if (Result.isSuccess(result)) { result.success // => 42}Instances
makeEquivalence
Creates an Equivalence for comparing two Result values.
Details
- Two
Successvalues are equal when thesuccessequivalence says so - Two
Failurevalues are equal when thefailureequivalence says so - A
Successand aFailureare never equal
Signature
declare function makeEquivalence<A, E>(success: Equivalence<A>, failure: Equivalence<E>): Equivalence<Result<A, E>>Example
(Comparing Results for equality)
import { Equivalence, Result } from "effect"
const eq = Result.makeEquivalence( Equivalence.strictEqual<number>(), Equivalence.strictEqual<string>())
eq(Result.succeed(1), Result.succeed(1)) // => true
eq(Result.succeed(1), Result.fail("x")) // => falseMapping
Wraps the success value of a Result into a named field, producing a
Result<Record<N, A>>.
When to use
Use to name the success value of an existing Result before continuing a
do-notation pipeline.
Details
This is typically used to start a do-notation chain from an existing
Result.
See
Signature
declare const bindTo: { <N extends string>(name: N): <R, L>(self: Result<R, L>) => Result<Record<N, R>, L>; <R, L, N extends string>(self: Result<R, L>, name: N): Result<Record<N, R>, L>;}Example
(Wrapping a value into a named field)
import { pipe, Result } from "effect"
pipe( Result.succeed(42), Result.bindTo("answer")) // => Result.succeed({ answer: 42 })Transforms the success channel of a Result, leaving the failure channel unchanged.
When to use
Use to apply a transformation to the success value of a Result while
preserving any existing failure.
Details
- If the result is a
Success, appliesfto the value and returns a newSuccess - If the result is a
Failure, returns it as-is - Use flatMap if
freturns aResult(to avoid nested Results)
See
Signature
declare const map: { <A, A2>(f: (ok: A) => A2): <E>(self: Result<A, E>) => Result<A2, E>; <A, E, A2>(self: Result<A, E>, f: (ok: A) => A2): Result<A2, E>;}Example
(Doubling the success value)
import { pipe, Result } from "effect"
pipe( Result.succeed(3), Result.map((n) => n * 2)) // => Result.succeed(6)Transforms both the success and failure channels of a Result.
When to use
Use to transform both success and failure values without changing whether the result succeeds or fails.
Details
- Applies
onSuccessif the result is aSuccess - Applies
onFailureif the result is aFailure
See
Signature
declare const mapBoth: { <E, E2, A, A2>(options: { readonly onFailure: (left: E) => E2; readonly onSuccess: (right: A) => A2; }): (self: Result<A, E>) => Result<A2, E2>; <E, A, E2, A2>(self: Result<A, E>, options: { readonly onFailure: (left: E) => E2; readonly onSuccess: (right: A) => A2; }): Result<A2, E2>;}Example
(Mapping both channels)
import { pipe, Result } from "effect"
pipe( Result.succeed(1), Result.mapBoth({ onSuccess: (n) => n + 1, onFailure: (e) => `Error: ${e}` })) // => Result.succeed(2)Transforms the failure channel of a Result, leaving the success channel unchanged.
When to use
Use to transform only the failure channel while preserving success values.
Details
- If the result is a
Failure, appliesfto the error and returns a newFailure - If the result is a
Success, returns it as-is
See
Signature
declare const mapError: { <E, E2>(f: (err: E) => E2): <A>(self: Result<A, E>) => Result<A, E2>; <A, E, E2>(self: Result<A, E>, f: (err: E) => E2): Result<A, E2>;}Example
(Adding context to an error)
import { pipe, Result } from "effect"
pipe( Result.fail("not found"), Result.mapError((e) => `Error: ${e}`)) // => Result.fail("Error: not found")Runs a side-effect on the success value without altering the Result.
Details
- If the result is a
Success, callsfwith the value (return value is ignored) - If the result is a
Failure,fis not called - Returns the original
Resultunchanged (same reference) - Useful for logging, debugging, or performing mutations outside the Result chain
See
- map to transform the success value
Signature
declare const tap: { <A>(f: (a: A) => void): <E>(self: Result<A, E>) => Result<A, E>; <A, E>(self: Result<A, E>, f: (a: A) => void): Result<A, E>;}Example
(Logging a success value)
import { pipe, Result } from "effect"
const values: Array<number> = []const result = pipe( Result.succeed(42), Result.tap((n) => values.push(n)))
values // => [42]result // => Result.succeed(42)Models
The failure variant of Result. Wraps an error of type E.
Details
- Access the error via the
.failureproperty - Use isFailure to narrow a
ResulttoFailure - Create with fail
See
Signature
interface Failure<out A, out E> extends Pipeable, Inspectable { readonly _op: "Failure"; readonly _tag: "Failure"; [ignoreSymbol]?: ResultUnifyIgnore; [typeSymbol]?: unknown; [unifySymbol]?: ResultUnify<Failure<A, E>>; readonly "~effect/data/Result": { readonly _A: Covariant<E>; readonly _E: Covariant<A>; }; readonly failure: E; [iterator](): ResultIterator<Result<A, E>>;}Example
(Accessing the failure value)
import { Result } from "effect"
const failure = Result.fail("Network error")
if (Result.isFailure(failure)) { failure.failure // => "Network error"}A value that is either Success<A, E> or Failure<A, E>.
When to use
Use when both success and failure should remain available as data and
Option would lose failure information.
Details
- Use succeed / fail to construct
- Use match to fold both branches
- Use isSuccess / isFailure to narrow the type
E defaults to never, so Result<number> means a result that cannot fail.
See
Signature
type Result<A, E = never> = Success<A, E> | Failure<A, E>Example
(Creating and matching a Result)
import { Result } from "effect"
Result.match(Result.succeed(42), { onSuccess: (value) => `Success: ${value}`, onFailure: (error) => `Error: ${error}`}) // => "Success: 42"ResultUnify interface
Type-level utility for unifying Result types in generic contexts.
Details
This is an internal interface used by the Effect type system. You typically do not need to reference it directly.
Signature
interface ResultUnify<T extends { [typeSymbol]?: any;}> { Result?: () => T[typeof typeSymbol] extends Result<A, E> | _ ? Result<A, E> : never;}ResultUnifyIgnore interface
Marker interface for ignoring unification in Result types.
Details
This is an internal interface used by the Effect type system. You typically do not need to reference it directly.
Signature
interface ResultUnifyIgnore {}The success variant of Result. Wraps a value of type A.
Details
- Access the value via the
.successproperty - Use isSuccess to narrow a
ResulttoSuccess - Create with succeed
See
Signature
interface Success<out A, out E> extends Pipeable, Inspectable { readonly _op: "Success"; readonly _tag: "Success"; [ignoreSymbol]?: ResultUnifyIgnore; [typeSymbol]?: unknown; [unifySymbol]?: ResultUnify<Success<A, E>>; readonly "~effect/data/Result": { readonly _A: Covariant<E>; readonly _E: Covariant<A>; }; readonly success: A; [iterator](): ResultIterator<Result<A, E>>;}Example
(Accessing the success value)
import { Result } from "effect"
const success = Result.succeed(42)
if (Result.isSuccess(success)) { success.success // => 42}Other
Signature
declare const let: { <N extends string, R extends object, B>(name: Exclude<N, keyof R>, f: (r: NoInfer<R>) => B): <L>(self: Result<R, L>) => Result<{ [K in string | number | symbol]: K extends keyof R ? R[K] : B }, L>; <R extends object, L, N extends string, B>(self: Result<R, L>, name: Exclude<N, keyof R>, f: (r: NoInfer<R>) => B): Result<{ [K in string | number | symbol]: K extends keyof R ? R[K] : B }, L>;}Namespace containing type-level utilities for extracting the inner types
of a Result.
Example
(Extracting inner types)
import { Result } from "effect"
type R = Result.Result<number, string>
// numbertype A = Result.Result.Success<R>
// stringtype E = Result.Result.Failure<R>
const success: A = 42const failure: E = "error"Signature
declare const try: { <A, E>(options: { readonly catch: (error: unknown) => E; readonly try: LazyArg<A>; }): Result<A, E>; <A>(evaluate: LazyArg<A>): Result<A, unknown>;}Signature
declare const void: Result<void>Pattern Matching
Folds a Result into a single value by applying one of two functions.
When to use
Use when a Result's success and failure branches should be collapsed into
one plain output type.
Details
- Applies
onSuccessif the result is aSuccess - Applies
onFailureif the result is aFailure - Both branches must return the same type (or a common supertype)
See
Signature
declare const match: { <E, B, A, C = B>(options: { readonly onFailure: (error: E) => B; readonly onSuccess: (ok: A) => C; }): (self: Result<A, E>) => B | C; <A, E, B, C = B>(self: Result<A, E>, options: { readonly onFailure: (error: E) => B; readonly onSuccess: (ok: A) => C; }): B | C;}Example
(Folding to a string)
import { pipe, Result } from "effect"
const format = Result.match({ onSuccess: (n: number) => `Got ${n}`, onFailure: (e: string) => `Err: ${e}`})
format(Result.succeed(42)) // => "Got 42"
format(Result.fail("timeout")) // => "Err: timeout"Sequencing
Collects a structure of Results into a single Result of collected values.
When to use
Use to collect independent Result values into one Result while preserving
the original structure.
Details
Accepts:
- A tuple/array: returns
Resultwith a tuple/array of success values - A struct (record): returns
Resultwith a struct of success values - An iterable: returns
Resultwith an array of success values
Short-circuits on the first Failure encountered; later elements are not inspected.
See
Signature
declare const all: <I extends Iterable<Result<any, any>> | Record<string, Result<any, any>>>(input: I) => [I] extends [ReadonlyArray<Result<any, any>>] ? Result<{ [K in keyof I]: [I[K]] extends [Result<infer R, any>] ? R : never }, I[number] extends never ? never : [I[number]] extends [Result<any, infer L>] ? L : never> : [I] extends [Iterable<Result<infer R, infer L>>] ? Result<Array<R>, L> : Result<{ [K in keyof I]: [I[K]] extends [Result<infer R, any>] ? R : never }, I[keyof I] extends never ? never : [I[keyof I]] extends [Result<any, infer L>] ? L : never>Example
(Collecting a tuple and a struct)
import { Result } from "effect"
// TupleResult.all([Result.succeed(1), Result.succeed("two")]) // => Result.succeed([1, "two"])
// StructResult.all({ x: Result.succeed(1), y: Result.fail("err") }) // => Result.fail("err")Provides a flexible variant of flatMap that accepts multiple input shapes.
When to use
Use to sequence a next step that may be a Result, a function, or a plain
value.
Details
The second argument can be:
- A function
(a: A) => Result<A2, E2>(same asflatMap) - A function
(a: A) => A2(auto-wrapped insucceed) - A
Result<A2, E2>value (ignores the success ofself) - A plain value
A2(auto-wrapped insucceed, ignoresself)
If self is a Failure, the second argument is never evaluated.
See
Signature
declare const andThen: { <A, A2, E2>(f: (a: A) => Result<A2, E2>): <E>(self: Result<A, E>) => Result<A2, E2 | E>; <A2, E2>(f: Result<A2, E2>): <A, E>(self: Result<A, E>) => Result<A2, E2 | E>; <A, A2>(f: (a: A) => A2): <E>(self: Result<A, E>) => Result<A2, E>; <A2>(right: NotFunction<A2>): <A, E>(self: Result<A, E>) => Result<A2, E>; <A, E, A2, E2>(self: Result<A, E>, f: (a: A) => Result<A2, E2>): Result<A2, E | E2>; <A, E, A2, E2>(self: Result<A, E>, f: Result<A2, E2>): Result<A2, E | E2>; <A, E, A2>(self: Result<A, E>, f: (a: A) => A2): Result<A2, E>; <A, E, A2>(self: Result<A, E>, f: NotFunction<A2>): Result<A2, E>;}Example
(Chaining Result values with different argument types)
import { pipe, Result } from "effect"
// With a function returning a Resultconst a = pipe( Result.succeed(1), Result.andThen((n) => Result.succeed(n + 1))) // => Result.succeed(2)
// With a plain mapping functionconst b = pipe( Result.succeed(1), Result.andThen((n) => n + 1)) // => Result.succeed(2)
// With a constant valueconst c = pipe(Result.succeed(1), Result.andThen("done")) // => Result.succeed("done")Adds a named field to the do-notation accumulator by running a Result-producing
function that receives the current accumulated object.
When to use
Use when you need to add a Result-producing step to a Result
do-notation pipeline and store its successful value under a named field in
the accumulated object.
Details
- Short-circuits on the first
Failure - The field name must not collide with existing keys
- Use let for pure (non-Result) computed fields
See
Signature
declare const bind: { <N extends string, A extends object, B, L2>(name: Exclude<N, keyof A>, f: (a: NoInfer<A>) => Result<B, L2>): <L1>(self: Result<A, L1>) => Result<{ [K in string | number | symbol]: K extends keyof A ? A[K] : B }, L2 | L1>; <A extends object, L1, N extends string, B, L2>(self: Result<A, L1>, name: Exclude<N, keyof A>, f: (a: NoInfer<A>) => Result<B, L2>): Result<{ [K in string | number | symbol]: K extends keyof A ? A[K] : B }, L1 | L2>;}Example
(Binding Result values)
import { pipe, Result } from "effect"
pipe( Result.Do, Result.bind("x", () => Result.succeed(2)), Result.bind("y", ({ x }) => Result.succeed(x + 3))) // => Result.succeed({ x: 2, y: 5 })Chains a function that returns a Result onto a successful value.
When to use
Use to sequence Result-returning computations that should short-circuit on
failure.
Details
- If
selfis aSuccess, appliesfto the value and returns the resultingResult - If
selfis aFailure, short-circuits and returns it unchanged - The error types are merged into a union (
E | E2) - This is the monadic
bind/>>=forResult
See
Signature
declare const flatMap: { <A, A2, E2>(f: (a: A) => Result<A2, E2>): <E>(self: Result<A, E>) => Result<A2, E2 | E>; <A, E, A2, E2>(self: Result<A, E>, f: (a: A) => Result<A2, E2>): Result<A2, E | E2>;}Example
(Validating sequentially)
import { pipe, Result } from "effect"
pipe( Result.succeed(5), Result.flatMap((n) => n > 0 ? Result.succeed(n * 2) : Result.fail("not positive") )) // => Result.succeed(10)Transforming
Swaps the success and failure channels of a Result.
When to use
Use to swap channels when failure-focused operations are easier through success-oriented combinators.
Details
Success<A>becomesFailure<A>(i.e.,Result<E, A>)Failure<E>becomesSuccess<E>(i.e.,Result<E, A>)- Useful when you want to apply success-oriented operations (like
map) to the error channel, then flip back
See
- mapError to transform the error without swapping
Signature
declare function flip<A, E>(self: Result<A, E>): Result<E, A>Example
(Swapping channels)
import { Result } from "effect"
Result.flip(Result.succeed(42)) // => Result.fail(42)
Result.flip(Result.fail("error")) // => Result.succeed("error")Transposing
transposeMapOption
Maps an Option value with a Result-producing function, then transposes
the structure from Option<Result<B, E>> to Result<Option<B>, E>.
When to use
Use when an optional value should be validated only when present, preserving
absence as a successful None.
Details
NonebecomesSuccess(None)(the function is never called)Some(a)wheref(a)isSuccess(b)becomesSuccess(Some(b))Some(a)wheref(a)isFailure(e)becomesFailure(e)
See
- transposeOption when the Option already contains a Result
Signature
declare const transposeMapOption: <A, B, E = never>(f: (self: A) => Result<B, E>) => (self: Option<A>) => Result<Option<B>, E> & <A, B, E = never>(self: Option<A>, f: (self: A) => Result<B, E>) => Result<Option<B>, E>Example
(Mapping and transposing in one step)
import { Option, Result } from "effect"
const parse = (s: string) => isNaN(Number(s)) ? Result.fail("not a number" as const) : Result.succeed(Number(s))
Result.transposeMapOption(Option.some("42"), parse) // => Result.succeed(Option.some(42))
Result.transposeMapOption(Option.none(), parse) // => Result.succeed(Option.none())transposeOption
Transforms Option<Result<A, E>> into Result<Option<A>, E>.
When to use
Use when optional absence should be treated as a successful None, while an
inner Result failure should still fail the whole result.
Details
NonebecomesSuccess(None)Some(Success(a))becomesSuccess(Some(a))Some(Failure(e))becomesFailure(e)
See
- transposeMapOption to map and transpose in one step
Signature
declare function transposeOption<A = never, E = never>(self: Option<Result<A, E>>): Result<Option<A>, E>Example
(Transposing an Option of a Result)
import { Option, Result } from "effect"
Result.transposeOption(Option.some(Result.succeed(42))) // => Result.succeed(Option.some(42))
Result.transposeOption(Option.none<Result.Result<number, string>>()) // => Result.succeed(Option.none())Utility Types
ResultTypeLambda interface
Higher-kinded type representation for Result.
Details
Used internally to integrate Result with generic type-class utilities
(e.g., map, flatMap abstractions). You typically do not need to
reference this directly.
Signature
interface ResultTypeLambda extends TypeLambda { readonly type: Result<unknown, unknown>;}