import { Applicative } from './applicative'; export abstract class Monad extends Applicative { public abstract override bind(f: (a: a) => Monad): Monad; public abstract join(this: Monad>): Monad; } export namespace Monad { export declare function Return(a: a): Monad; export function bind(f: (a: a) => Monad, m: Monad): Monad { return m.bind(f); } export declare function sequence(fm: Monad[]): Monad>; //export declare function sequence(fm: Monad>): AtomicPromise>; }