import { Kind } from '../../kinds/index.js'; import { Applicative } from '../applicative'; import { TypeSkell } from '../../typeskell/index.js'; export declare namespace Monad { type $flatMap = TypeSkell<'(a -> M b ..x) -> M a ..y -> M b ..xy', { M: M; }>; type $flatten = TypeSkell<'M (M a ..x) ..y -> M a ..xy', { M: M; }>; type $bind = TypeSkell<'(DoName n a) (a -> F b ..x) -> F a ..y -> F (Do n a b) ..xy', { DoName: Kind.DoName; Do: Kind.Do; F: F; }>; } export interface Monad extends Applicative { /** * flatMap :: `(a -> M b) -> M a -> M b` */ flatMap: Monad.$flatMap; } /** * flatten :: `Monad M => M (M a) -> M a` */ export declare const flatten: (m: Monad) => Monad.$flatten; /** * bind :: `Monad M => (DoName n a) (a -> M b) -> M a -> M (Do n a b)` */ export declare const bind: (f: Monad) => Monad.$bind;