import { Applicative, ApplicativeDictionary } from "./applicative";
export interface Monad extends Applicative {
multi: boolean;
chain(f: (a: A) => Monad): Monad;
flatten(): Monad;
}
export interface MonadDictionary extends ApplicativeDictionary {
multi: boolean;
}
export declare abstract class AbstractMonad implements Monad {
abstract multi: boolean;
abstract of(b: B): Monad;
chain(f: (a: A) => Monad): Monad;
flatten(): Monad;
map(f: (a: A) => B): Monad;
mapTo(b: B): Monad;
ap(m: Monad<(a: A) => B>): Monad;
lift(f: (t: T1) => R, m: Applicative): Applicative;
lift(f: (t: T1, u: T2) => R, m1: Applicative, m2: Applicative): Applicative;
lift(f: (t1: T1, t2: T2, t3: T3) => R, m1: Applicative, m2: Applicative, m3: Applicative): Applicative;
}
export declare function monad(constructor: Function): void;
export declare function flatten(m: A[][]): A[];
export declare function flatten(m: Monad>): any;
export declare function chain(f: (a: A) => B[], m: A[]): B[];
export declare function chain(f: (a: A) => Monad, m: Monad): any;
export declare function go>(gen: () => Iterator): any;
export declare function fgo(gen: (...a: any[]) => Iterator>): (...args: any[]) => any;