maybetyped
Version:
Well-typed functional Maybe monad
20 lines (19 loc) • 1 kB
TypeScript
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;