aboutsummaryrefslogtreecommitdiff
path: root/src/utils/result.ts
blob: 39a7fe6827b670ee2cb2f8ab0b21e7ea6f08b79d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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),
  })