UNPKG

maybetyped

Version:

Well-typed functional Maybe monad

20 lines (19 loc) 1 kB
import { ConstructorFor, Nullable } from 'simplytyped'; import { MatchType } from './maybe'; export interface Monad<T> { map: <U>(f: (v: T) => Nullable<U>) => any; } export declare type MonadLike<T> = Monad<T> | PromiseLike<T>; export declare type MonadValue<T extends MonadLike<any>> = T extends PromiseLike<infer U> ? U : T extends Monad<infer U> ? U : never; export declare type MaybeValue<T extends MonadLike<any>> = NonNullable<MonadValue<T>>; export declare class MaybeT<T extends MonadLike<unknown>> { private value; private constructor(); static maybeT<V extends MonadLike<unknown>>(monad: V): MaybeT<V>; map<U>(f: (v: MaybeValue<T>) => U): MaybeT<Monad<U>>; caseOf<R>(matcher: MatchType<MaybeValue<T>, R>): MaybeT<Monad<R>>; orElse<U extends MonadValue<any>>(def: U | (() => U)): T | U; asNullable(): T; asType<M extends MonadLike<Nullable<MonadValue<T>>>>(c: ConstructorFor<M>): M; } export declare const maybeT: typeof MaybeT.maybeT;