Skip to main content Link Search Menu Expand Document (external link)

Result overview

Added in v1.0.0


Table of contents


Builder

Builder (type alias)

Signature

export type Builder<Out, A, E, I> = Pipeable & {
  onWaiting<B>(f: (result: Result<A, E>) => B): Builder<Out | B, A, E, I>
  onDefect<B>(f: (defect: unknown, result: Failure<A, E>) => B): Builder<Out | B, A, E, I>
  orElse<B>(orElse: LazyArg<B>): Out | B
  orNull(): Out | null
  render(): [A | I] extends [never] ? Out : Out | null
} & ([I] extends [never]
    ? {}
    : {
        onInitial<B>(f: (result: Initial<A, E>) => B): Builder<Out | B, A, E, never>
        onInitialOrWaiting<B>(f: (result: Result<A, E>) => B): Builder<Out | B, A, E, never>
      }) &
  ([A] extends [never]
    ? {}
    : {
        onSuccess<B>(f: (value: A, result: Success<A, E>) => B): Builder<Out | B, never, E, I>
      }) &
  ([E] extends [never]
    ? {}
    : {
        onFailure<B>(f: (cause: Cause.Cause<E>, result: Failure<A, E>) => B): Builder<Out | B, A, never, I>

        onError<B>(f: (error: E, result: Failure<A, E>) => B): Builder<Out | B, A, never, I>

        onErrorIf<B extends E, C>(
          refinement: Refinement<E, B>,
          f: (error: B, result: Failure<A, E>) => C
        ): Builder<Out | C, A, Types.EqualsWith<E, B, E, Exclude<E, B>>, I>
        onErrorIf<C>(predicate: Predicate<E>, f: (error: E, result: Failure<A, E>) => C): Builder<Out | C, A, E, I>

        onErrorTag<const Tags extends ReadonlyArray<Types.Tags<E>>, B>(
          tags: Tags,
          f: (error: Types.ExtractTag<E, Tags[number]>, result: Failure<A, E>) => B
        ): Builder<Out | B, A, Types.ExcludeTag<E, Tags[number]>, I>
        onErrorTag<const Tag extends Types.Tags<E>, B>(
          tag: Tag,
          f: (error: Types.ExtractTag<E, Tag>, result: Failure<A, E>) => B
        ): Builder<Out | B, A, Types.ExcludeTag<E, Tag>, I>
      })

Added in v1.0.0

builder

Signature

export declare const builder: <A extends Result<any, any>>(
  self: A
) => Builder<
  never,
  A extends Success<infer _A, infer _E> ? _A : never,
  A extends Failure<infer _A, infer _E> ? _E : never,
  A extends Initial<infer _A, infer _E> ? true : never
>

Added in v1.0.0

Guards

isResult

Signature

export declare const isResult: (u: unknown) => u is Result<unknown, unknown>

Added in v1.0.0

Schemas

Encoded (type alias)

Signature

export type Encoded<A, E> =
  | {
      readonly _tag: "Initial"
      readonly waiting: boolean
    }
  | {
      readonly _tag: "Success"
      readonly waiting: boolean
      readonly timestamp: number
      readonly value: A
    }
  | {
      readonly _tag: "Failure"
      readonly waiting: boolean
      readonly previousValue: Schema_.OptionEncoded<A>
      readonly cause: Schema_.CauseEncoded<E, unknown>
    }

Added in v1.0.0

PartialEncoded (type alias)

Signature

export type PartialEncoded<A, E> =
  | {
      readonly _tag: "Initial"
      readonly waiting: boolean
    }
  | {
      readonly _tag: "Success"
      readonly waiting: boolean
      readonly timestamp: number
      readonly value: A
    }
  | {
      readonly _tag: "Failure"
      readonly waiting: boolean
      readonly previousValue: Option.Option<A>
      readonly cause: Cause.Cause<E>
    }

Added in v1.0.0

Schema

Signature

export declare const Schema: <
  Success extends Schema_.Schema.All = typeof Schema_.Never,
  Error extends Schema_.Schema.All = typeof Schema_.Never
>(options: {
  readonly success?: Success | undefined
  readonly error?: Error | undefined
}) => Schema_.transform<
  Schema_.Schema<
    PartialEncoded<Success["Type"], Error["Type"]>,
    Encoded<Success["Encoded"], Error["Encoded"]>,
    Success["Context"] | Error["Context"]
  >,
  Schema_.Schema<Result<Success["Type"], Error["Type"]>>
>

Added in v1.0.0

schemaFromSelf

Signature

export declare const schemaFromSelf: Schema_.Schema<Result<any, any>, Result<any, any>, never>

Added in v1.0.0

accessors

cause

Signature

export declare const cause: <A, E>(self: Result<A, E>) => Option.Option<Cause.Cause<E>>

Added in v1.0.0

error

Signature

export declare const error: <A, E>(self: Result<A, E>) => Option.Option<E>

Added in v1.0.0

getOrElse

Signature

export declare const getOrElse: {
  <B>(orElse: LazyArg<B>): <A, E>(self: Result<A, E>) => A | B
  <A, E, B>(self: Result<A, E>, orElse: LazyArg<B>): A | B
}

Added in v1.0.0

getOrThrow

Signature

export declare const getOrThrow: <A, E>(self: Result<A, E>) => A

Added in v1.0.0

value

Signature

export declare const value: <A, E>(self: Result<A, E>) => Option.Option<A>

Added in v1.0.0

combinators

all

Combines multiple results into a single result. Also works with non-result values.

Signature

export declare const all: <const Arg extends Iterable<any> | Record<string, any>>(
  results: Arg
) => Result<
  [Arg] extends [ReadonlyArray<any>]
    ? { -readonly [K in keyof Arg]: [Arg[K]] extends [Result<infer _A, infer _E>] ? _A : Arg[K] }
    : [Arg] extends [Iterable<infer _A>]
      ? _A extends Result<infer _AA, infer _E>
        ? _AA
        : _A
      : [Arg] extends [Record<string, any>]
        ? { -readonly [K in keyof Arg]: [Arg[K]] extends [Result<infer _A, infer _E>] ? _A : Arg[K] }
        : never,
  [Arg] extends [ReadonlyArray<any>]
    ? Result.Failure<Arg[number]>
    : [Arg] extends [Iterable<infer _A>]
      ? Result.Failure<_A>
      : [Arg] extends [Record<string, any>]
        ? Result.Failure<Arg[keyof Arg]>
        : never
>

Added in v1.0.0

map

Signature

export declare const map: {
  <A, B>(f: (a: A) => B): <E>(self: Result<A, E>) => Result<B, E>
  <E, A, B>(self: Result<A, E>, f: (a: A) => B): Result<B, E>
}

Added in v1.0.0

match

Signature

export declare const match: {
  <A, E, X, Y, Z>(options: {
    readonly onInitial: (_: Initial<A, E>) => X
    readonly onFailure: (_: Failure<A, E>) => Y
    readonly onSuccess: (_: Success<A, E>) => Z
  }): (self: Result<A, E>) => X | Y | Z
  <A, E, X, Y, Z>(
    self: Result<A, E>,
    options: {
      readonly onInitial: (_: Initial<A, E>) => X
      readonly onFailure: (_: Failure<A, E>) => Y
      readonly onSuccess: (_: Success<A, E>) => Z
    }
  ): X | Y | Z
}

Added in v1.0.0

matchWithError

Signature

export declare const matchWithError: {
  <A, E, W, X, Y, Z>(options: {
    readonly onInitial: (_: Initial<A, E>) => W
    readonly onError: (error: E, _: Failure<A, E>) => X
    readonly onDefect: (defect: unknown, _: Failure<A, E>) => Y
    readonly onSuccess: (_: Success<A, E>) => Z
  }): (self: Result<A, E>) => W | X | Y | Z
  <A, E, W, X, Y, Z>(
    self: Result<A, E>,
    options: {
      readonly onInitial: (_: Initial<A, E>) => W
      readonly onError: (error: E, _: Failure<A, E>) => X
      readonly onDefect: (defect: unknown, _: Failure<A, E>) => Y
      readonly onSuccess: (_: Success<A, E>) => Z
    }
  ): W | X | Y | Z
}

Added in v1.0.0

matchWithWaiting

Signature

export declare const matchWithWaiting: {
  <A, E, W, X, Y, Z>(options: {
    readonly onWaiting: (_: Result<A, E>) => W
    readonly onError: (error: E, _: Failure<A, E>) => X
    readonly onDefect: (defect: unknown, _: Failure<A, E>) => Y
    readonly onSuccess: (_: Success<A, E>) => Z
  }): (self: Result<A, E>) => W | X | Y | Z
  <A, E, W, X, Y, Z>(
    self: Result<A, E>,
    options: {
      readonly onWaiting: (_: Result<A, E>) => W
      readonly onError: (error: E, _: Failure<A, E>) => X
      readonly onDefect: (defect: unknown, _: Failure<A, E>) => Y
      readonly onSuccess: (_: Success<A, E>) => Z
    }
  ): W | X | Y | Z
}

Added in v1.0.0

toExit

Signature

export declare const toExit: <A, E>(self: Result<A, E>) => Exit.Exit<A, E | Cause.NoSuchElementException>

Added in v1.0.0

constructors

fail

Signature

export declare const fail: <E, A = never>(
  error: E,
  options?: {
    readonly previousSuccess?: Option.Option<Success<A, E>> | undefined
    readonly waiting?: boolean | undefined
  }
) => Failure<A, E>

Added in v1.0.0

failWithPrevious

Signature

export declare const failWithPrevious: <A, E>(
  error: E,
  options: { readonly previous: Option.Option<Result<A, E>>; readonly waiting?: boolean | undefined }
) => Failure<A, E>

Added in v1.0.0

failure

Signature

export declare const failure: <E, A = never>(
  cause: Cause.Cause<E>,
  options?: {
    readonly previousSuccess?: Option.Option<Success<A, E>> | undefined
    readonly waiting?: boolean | undefined
  }
) => Failure<A, E>

Added in v1.0.0

failureWithPrevious

Signature

export declare const failureWithPrevious: <A, E>(
  cause: Cause.Cause<E>,
  options: { readonly previous: Option.Option<Result<A, E>>; readonly waiting?: boolean | undefined }
) => Failure<A, E>

Added in v1.0.0

fromExit

Signature

export declare const fromExit: <A, E>(exit: Exit.Exit<A, E>) => Success<A, E> | Failure<A, E>

Added in v1.0.0

fromExitWithPrevious

Signature

export declare const fromExitWithPrevious: <A, E>(
  exit: Exit.Exit<A, E>,
  previous: Option.Option<Result<A, E>>
) => Success<A, E> | Failure<A, E>

Added in v1.0.0

initial

Signature

export declare const initial: <A = never, E = never>(waiting?: boolean) => Initial<A, E>

Added in v1.0.0

replacePrevious

Signature

export declare const replacePrevious: <R extends Result<any, any>, XE, A>(
  self: R,
  previous: Option.Option<Result<A, XE>>
) => With<R, A, Result.Failure<R>>

Added in v1.0.0

success

Signature

export declare const success: <A, E = never>(
  value: A,
  options?: { readonly waiting?: boolean | undefined; readonly timestamp?: number | undefined }
) => Success<A, E>

Added in v1.0.0

waiting

Signature

export declare const waiting: <R extends Result<any, any>>(self: R) => R

Added in v1.0.0

waitingFrom

Signature

export declare const waitingFrom: <A, E>(previous: Option.Option<Result<A, E>>) => Result<A, E>

Added in v1.0.0

models

Failure (interface)

Signature

export interface Failure<A, E = never> extends Result.Proto<A, E> {
  readonly _tag: "Failure"
  readonly cause: Cause.Cause<E>
  readonly previousSuccess: Option.Option<Success<A, E>>
}

Added in v1.0.0

Initial (interface)

Signature

export interface Initial<A, E = never> extends Result.Proto<A, E> {
  readonly _tag: "Initial"
}

Added in v1.0.0

Result (type alias)

Signature

export type Result<A, E = never> = Initial<A, E> | Success<A, E> | Failure<A, E>

Added in v1.0.0

Result (namespace)

Added in v1.0.0

Proto (interface)

Signature

export interface Proto<A, E> extends Pipeable {
  readonly [TypeId]: {
    readonly E: (_: never) => E
    readonly A: (_: never) => A
  }
  readonly waiting: boolean
}

Added in v1.0.0

Failure (type alias)

Signature

export type Failure<R> = R extends Result<infer _, infer E> ? E : never

Added in v1.0.0

Success (type alias)

Signature

export type Success<R> = R extends Result<infer A, infer _> ? A : never

Added in v1.0.0

Success (interface)

Signature

export interface Success<A, E = never> extends Result.Proto<A, E> {
  readonly _tag: "Success"
  readonly value: A
  readonly timestamp: number
}

Added in v1.0.0

refinements

isFailure

Signature

export declare const isFailure: <A, E>(result: Result<A, E>) => result is Failure<A, E>

Added in v1.0.0

isInitial

Signature

export declare const isInitial: <A, E>(result: Result<A, E>) => result is Initial<A, E>

Added in v1.0.0

isInterrupted

Signature

export declare const isInterrupted: <A, E>(result: Result<A, E>) => result is Failure<A, E>

Added in v1.0.0

isNotInitial

Signature

export declare const isNotInitial: <A, E>(result: Result<A, E>) => result is Success<A, E> | Failure<A, E>

Added in v1.0.0

isSuccess

Signature

export declare const isSuccess: <A, E>(result: Result<A, E>) => result is Success<A, E>

Added in v1.0.0

type ids

TypeId

Signature

export declare const TypeId: typeof TypeId

Added in v1.0.0

TypeId (type alias)

Signature

export type TypeId = typeof TypeId

Added in v1.0.0

utils

With (type alias)

Signature

export type With<R extends Result<any, any>, A, E> =
  R extends Initial<infer _A, infer _E>
    ? Initial<A, E>
    : R extends Success<infer _A, infer _E>
      ? Success<A, E>
      : R extends Failure<infer _A, infer _E>
        ? Failure<A, E>
        : never

Added in v1.0.0