this repo has no description
1export type Option<T> = T | null | undefined 2 3export function isSome<T>(opt: Option<T>): opt is T { 4 return opt != null 5} 6 7export function isNone<T>(opt: Option<T>): opt is null | undefined { 8 return opt == null 9} 10 11export function map<T, U>(opt: Option<T>, fn: (t: T) => U): Option<U> { 12 return isSome(opt) ? fn(opt) : null 13} 14 15export function flatMap<T, U>(opt: Option<T>, fn: (t: T) => Option<U>): Option<U> { 16 return isSome(opt) ? fn(opt) : null 17} 18 19export function filter<T>(opt: Option<T>, predicate: (t: T) => boolean): Option<T> { 20 return isSome(opt) && predicate(opt) ? opt : null 21} 22 23export function getOrElse<T>(opt: Option<T>, defaultValue: T): T { 24 return isSome(opt) ? opt : defaultValue 25} 26 27export function getOrElseLazy<T>(opt: Option<T>, fn: () => T): T { 28 return isSome(opt) ? opt : fn() 29} 30 31export function getOrThrow<T>(opt: Option<T>, error?: string | Error): T { 32 if (isSome(opt)) return opt 33 if (error instanceof Error) throw error 34 throw new Error(error ?? 'Expected value but got null/undefined') 35} 36 37export function tap<T>(opt: Option<T>, fn: (t: T) => void): Option<T> { 38 if (isSome(opt)) fn(opt) 39 return opt 40} 41 42export function match<T, U>( 43 opt: Option<T>, 44 handlers: { some: (t: T) => U; none: () => U } 45): U { 46 return isSome(opt) ? handlers.some(opt) : handlers.none() 47} 48 49export function toArray<T>(opt: Option<T>): T[] { 50 return isSome(opt) ? [opt] : [] 51} 52 53export function fromArray<T>(arr: T[]): Option<T> { 54 return arr.length > 0 ? arr[0] : null 55} 56 57export function zip<T, U>(a: Option<T>, b: Option<U>): Option<[T, U]> { 58 return isSome(a) && isSome(b) ? [a, b] : null 59} 60 61export function zipWith<T, U, R>( 62 a: Option<T>, 63 b: Option<U>, 64 fn: (t: T, u: U) => R 65): Option<R> { 66 return isSome(a) && isSome(b) ? fn(a, b) : null 67} 68 69export function or<T>(a: Option<T>, b: Option<T>): Option<T> { 70 return isSome(a) ? a : b 71} 72 73export function orLazy<T>(a: Option<T>, fn: () => Option<T>): Option<T> { 74 return isSome(a) ? a : fn() 75} 76 77export function and<T, U>(a: Option<T>, b: Option<U>): Option<U> { 78 return isSome(a) ? b : null 79}