1export type Ok<T> = {
2 ok: true;
3 value: T;
4};
5export type Err<E> = {
6 ok: false;
7 error: E;
8};
9export type Result<T, E> = Ok<T> | Err<E>;
10
11export const ok = <T>(value: T): Ok<T> => {
12 return { ok: true, value };
13};
14export const err = <E>(error: E): Err<E> => {
15 // console.error(error);
16 return { ok: false, error };
17};
18export const expect = <T, E>(v: Result<T, E>, msg: string = 'expected result to not be error:') => {
19 if (v.ok) {
20 return v.value;
21 }
22 throw `${msg} ${v.error}`;
23};
24export const map = <T, E, U>(v: Result<T, E>, fn: (value: T) => U): Result<U, E> => {
25 if (v.ok) {
26 return ok(fn(v.value));
27 }
28 return err(v.error);
29};
30
31export type OkType<R> = R extends { ok: true; value: infer T } ? T : never;
32export type ErrType<R> = R extends { ok: false; error: infer E } ? E : never;