export type Ok = { ok: true; value: T; }; export type Err = { ok: false; error: E; }; export type Result = Ok | Err; export const ok = (value: T): Ok => { return { ok: true, value }; }; export const err = (error: E): Err => { // console.error(error); return { ok: false, error }; }; export const expect = (v: Result, msg: string = 'expected result to not be error:') => { if (v.ok) { return v.value; } throw `${msg} ${v.error}`; }; export const map = (v: Result, fn: (value: T) => U): Result => { if (v.ok) { return ok(fn(v.value)); } return err(v.error); }; export type OkType = R extends { ok: true; value: infer T } ? T : never; export type ErrType = R extends { ok: false; error: infer E } ? E : never;