import { AbstractMonad } from "./monad"; export declare type FreerMatch = { pure: (a: A) => K; bind: (u: F, k: (a: any) => Freer) => K; }; export declare abstract class Freer extends AbstractMonad { static of(b: B): Freer; of(b: B): Freer; abstract match(m: FreerMatch): K; abstract map(f: (a: A) => B): Freer; multi: false; static multi: boolean; abstract chain(f: (a: A) => Freer): Freer; } export declare class Pure extends Freer { private a; constructor(a: A); match(m: FreerMatch): K; map(f: (a: A) => B): Freer; chain(f: (a: A) => Freer): Freer; } export declare class Bind extends Freer { val: any; f: (a: any) => Freer; constructor(val: any, f: (a: any) => Freer); match(m: FreerMatch): K; map(f: (a: A) => B): Freer; chain(f: (a: A) => Freer): Freer; } export declare function liftF(fa: any): Freer;