Hyperlinkv0.8.0-beta.28

Result

Result.allconsteffect/Result.ts:1454
<
  const I extends
    | Iterable<Result<any, any>>
    | Record<string, Result<any, any>>
>(
  input: I
): [I] extends [ReadonlyArray<Result<any, any>>]
  ? Result<
      {
        -readonly [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<
      {
        -readonly [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
    >

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 Result with a tuple/array of success values
  • A struct (record): returns Result with a struct of success values
  • An iterable: returns Result with an array of success values

Short-circuits on the first Failure encountered; later elements are not inspected.

Example (Collecting a tuple and a struct)

import { Result } from "effect"

// Tuple
const tuple = Result.all([Result.succeed(1), Result.succeed("two")])
console.log(tuple)
// Output: { _tag: "Success", success: [1, "two"], ... }

// Struct
const struct = Result.all({ x: Result.succeed(1), y: Result.fail("err") })
console.log(struct)
// Output: { _tag: "Failure", failure: "err", ... }
sequencingflatMapgen
Source effect/Result.ts:145434 lines
export const all: <const I extends Iterable<Result<any, any>> | Record<string, Result<any, any>>>(
  input: I
) => [I] extends [ReadonlyArray<Result<any, any>>] ? Result<
    { -readonly [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<
    { -readonly [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
  > = (
    input: Iterable<Result<any, any>> | Record<string, Result<any, any>>
  ): Result<any, any> => {
    if (Symbol.iterator in input) {
      const out: Array<Result<any, any>> = []
      for (const e of input) {
        if (isFailure(e)) {
          return e
        }
        out.push(e.success)
      }
      return succeed(out)
    }

    const out: Record<string, any> = {}
    for (const key of Object.keys(input)) {
      const e = input[key]
      if (isFailure(e)) {
        return e
      }
      out[key] = e.success
    }
    return succeed(out)
  }
Referenced by 1 symbols