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;
