API reference@evolu/commonResult › allResult

Call Signature

function allResult<T>(
  results: T,
): Result<
  { [K in string | number | symbol]: InferOk<T[K]> },
  InferErr<T[number]>
>;

Defined in: packages/common/src/Result.ts:995

Collects successful values from Results.

Stops processing the input at the first Err. Mapping overloads do not call the mapper for the remaining input values.

Pass { collect: false } to return Result<void, E> without storing the Ok values in an output collection.

Example

import {
  allResult,
  assertOk,
  assertType,
  ok,
  type Result,
  type Typed,
} from "@evolu/common";

const getCount = (): Result<number, CountUnavailableError> => ok(2);

interface CountUnavailableError extends Typed<"CountUnavailable"> {}

const getLabel = (): Result<string, LabelUnavailableError> => ok("books");

interface LabelUnavailableError extends Typed<"LabelUnavailable"> {}

const values = allResult([getCount(), getLabel()]);
assertType<
  Result<
    readonly [number, string],
    CountUnavailableError | LabelUnavailableError
  >,
  typeof values
>();
assertOk(values, [2, "books"]);

Call Signature

function allResult<T>(
  results: T,
): Result<
  { [P in string | number | symbol]: InferOk<T[P]> },
  [keyof T] extends [never] ? never : InferErr<T[keyof T]>
>;

Defined in: packages/common/src/Result.ts:1022

Returns an object with the same keys.

Example

import {
  allResult,
  assertOk,
  assertType,
  ok,
  type Result,
} from "@evolu/common";

const resultsByName = { a: ok(1), b: ok(2) } as const;
const valuesByName = allResult(resultsByName);
assertType<
  Result<{ readonly a: number; readonly b: number }>,
  typeof valuesByName
>();
assertOk(valuesByName, { a: 1, b: 2 });

Call Signature

function allResult<T, E>(
  results: Iterable<Result<T, E>>,
): Result<readonly T[], E>;

Defined in: packages/common/src/Result.ts:1049

For dynamic or generated result lists.

Example

import {
  allResult,
  assertOk,
  assertType,
  ok,
  type Result,
} from "@evolu/common";

const results: ReadonlyArray<Result<number>> = [ok(1), ok(2)];
const numbers = allResult(results);
assertType<Result<ReadonlyArray<number>>, typeof numbers>();
assertOk(numbers, [1, 2]);

Call Signature

function allResult<T, E>(
  results: readonly [Result<T, E>, Result<T, E>],
): Result<readonly [T, T], E>;

Defined in: packages/common/src/Result.ts:1074

Preserves a non-empty array on success.

Example

import {
  allResult,
  assertOk,
  assertType,
  ok,
  type NonEmptyReadonlyArray,
  type Result,
} from "@evolu/common";

const results: NonEmptyReadonlyArray<Result<number>> = [ok(1), ok(2)];
const numbers = allResult(results);
assertType<Result<NonEmptyReadonlyArray<number>>, typeof numbers>();
assertOk(numbers, [1, 2]);

Call Signature

function allResult<T>(
  results: T,
  options: {
    collect: false;
  },
): Result<void, [keyof T] extends [never] ? never : InferErr<T[keyof T]>>;

Defined in: packages/common/src/Result.ts:1097

Does not collect the Ok values from a record of Results.

Example

import {
  allResult,
  assertOk,
  assertType,
  ok,
  type Result,
} from "@evolu/common";

const result = allResult({ a: ok(1), b: ok(2) }, { collect: false });
assertType<Result<void>, typeof result>();
assertOk(result, undefined);

Call Signature

function allResult<R>(
  results: Iterable<R>,
  options: {
    collect: false;
  },
): Result<void, InferErr<R>>;

Defined in: packages/common/src/Result.ts:1125

Does not collect the Ok values from an iterable of Results.

Use this overload when the Results already exist and only their collective success or failure matters.

Example

import {
  allResult,
  assertOk,
  assertType,
  ok,
  type Result,
} from "@evolu/common";

const results: ReadonlyArray<Result<number>> = [ok(1), ok(2)];
const result = allResult(results, { collect: false });
assertType<Result<void>, typeof result>();
assertOk(result, undefined);

Call Signature

function allResult<A, R>(
  values: A,
  fn: (value: A[number]) => R,
): Result<{ [K in string | number | symbol]: InferOk<R> }, InferErr<R>>;

Defined in: packages/common/src/Result.ts:1155

Maps a non-empty array or tuple to Results and preserves its shape.

Example

import {
  allResult,
  assertOk,
  assertType,
  ok,
  type NonEmptyReadonlyArray,
  type Result,
} from "@evolu/common";

const numbers: NonEmptyReadonlyArray<number> = [1, 2];
const doubled = allResult(numbers, (number) => ok(number * 2));
assertType<Result<NonEmptyReadonlyArray<number>>, typeof doubled>();
assertOk(doubled, [2, 4]);

const tuple = allResult([1, 2] as const, (number) => ok(number * 2));
assertType<Result<readonly [number, number]>, typeof tuple>();
assertOk(tuple, [2, 4]);

Call Signature

function allResult<A, R>(
  values: Iterable<A>,
  fn: (value: A) => R,
): Result<readonly InferOk<R>[], InferErr<R>>;

Defined in: packages/common/src/Result.ts:1183

Maps a dynamic or generated value collection to Results.

Example

import {
  allResult,
  assertOk,
  assertType,
  ok,
  type Result,
} from "@evolu/common";

const numbers: Iterable<number> = new Set([1, 2]);
const doubled = allResult(numbers, (number) => ok(number * 2));
assertType<Result<ReadonlyArray<number>>, typeof doubled>();
assertOk(doubled, [2, 4]);

Call Signature

function allResult<A, R, K>(
  values: Readonly<Record<K, A>>,
  fn: (value: A) => R,
): Result<Readonly<Record<K, InferOk<R>>>, InferErr<R>>;

Defined in: packages/common/src/Result.ts:1220

Maps record values to Results and preserves the record's keys.

Example

import {
  allResult,
  assertOk,
  assertType,
  ok,
  type Result,
} from "@evolu/common";

interface User {
  readonly id: string;
}

const toUser = (id: string): Result<User> => ok({ id });

const userIdsByRole = { owner: "user-1", reviewer: "user-2" } as const;
const usersByRole = allResult(userIdsByRole, toUser);
assertType<
  Result<Readonly<Record<"owner" | "reviewer", User>>>,
  typeof usersByRole
>();
assertOk(usersByRole, {
  owner: { id: "user-1" },
  reviewer: { id: "user-2" },
});

Call Signature

function allResult<A, R>(
  values: Iterable<A>,
  fn: (value: A) => R,
  options: {
    collect: false;
  },
): Result<void, InferErr<R>>;

Defined in: packages/common/src/Result.ts:1259

Maps values to Results without collecting their Ok values.

This avoids allocating the output collection even when the mapped operations return success values.

Example

import {
  allResult,
  assertEqual,
  assertOk,
  assertType,
  ok,
  type Result,
} from "@evolu/common";

const visited: Array<number> = [];
const result = allResult(
  [1, 2],
  (number) => {
    visited.push(number);
    return ok(number * 2);
  },
  {
    collect: false,
  },
);
assertType<Result<void>, typeof result>();
assertOk(result, undefined);
assertEqual(visited, [1, 2]);

Call Signature

function allResult<A, R, K>(
  values: Readonly<Record<K, A>>,
  fn: (value: A) => R,
  options: {
    collect: false;
  },
): Result<void, InferErr<R>>;

Defined in: packages/common/src/Result.ts:1286

Maps record values to Results without collecting their Ok values.

Example

import {
  allResult,
  assertOk,
  assertType,
  ok,
  type Result,
} from "@evolu/common";

const result = allResult({ a: 1, b: 2 }, (number) => ok(number * 2), {
  collect: false,
});
assertType<Result<void>, typeof result>();
assertOk(result, undefined);