import { result } from '.' type Ok = { type: 'ok' val: T } export const ok = (val: T): Ok => ({ type: 'ok', val }) type Err = { type: 'err' err: T } export const err = (err: T): Err => ({ type: 'err', err }) export type Result = Ok | Err export const isOk = (r: result.Result): boolean => { switch (r.type) { case 'ok': return true default: return false } } export const getValue = (r: result.Result): TOk => { if (r.type === 'ok') { return r.val } throw new Error(`couldn't get value as type is error: ${r.err}`) } export const tap = ( r: result.Result, okFunc: (okRes: TOk) => void, errFunc: (errRes: TErr) => void = (err) => { console.log("default tap catch of error, note tap doesn't break chain") } ): result.Result => { switch (r.type) { case 'ok': okFunc(r.val) break case 'err': errFunc(r.err) break } return r } export const getError = ( r: result.Result ): TErr => { if (r.type === 'err') { return r.err } throw new Error(`couldn't get value as type is ok: ${r.val}`) }