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;