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