aboutsummaryrefslogtreecommitdiff
path: root/src/utils/result.ts
blob: c0120b863679683eb23b67573f6f4f3f1384414e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { Enum, constructors, match } from "./adt";

export type Result<V, E> = Enum<{ Ok: V, Err: E }>
export const Result = constructors<Result<any, any>>()

export const mapResult = <A, B, E>(res: Result<A, E>, fn: (_: A) => B): Result<B, E> =>
  chainResult(res, a => Result.Ok(fn(a)))

export const chainResult = <A, B, E>(res: Result<A, E>, fn: (_: A) => Result<B, E>): Result<B, E> =>
  match(res, {
    Ok: a => fn(a),
    Err: e => Result.Err(e),
  });