aboutsummaryrefslogtreecommitdiff
path: root/src/util/result.ts
blob: ca57c2ac9eb20fb6ddab7d09385c2a5128b37c20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
export type Result<T, E> =
  | { readonly success: true; readonly data: T }
  | { readonly success: false; readonly error: E };

export const ok = <T>(data: T): Result<T, never> => ({ success: true, data });
export const err = <E>(error: E): Result<never, E> => ({ success: false, error });

export const map = <T, U, E>(r: Result<T, E>, f: (t: T) => U): Result<U, E> =>
  r.success ? ok(f(r.data)) : r;

export const andThen = <T, U, E>(r: Result<T, E>, f: (t: T) => Result<U, E>): Result<U, E> =>
  r.success ? f(r.data) : r;

export const mapErr = <T, E, F>(r: Result<T, E>, f: (e: E) => F): Result<T, F> =>
  r.success ? r : err(f(r.error));