import type { Monad, Monad$GetTypeClassW } from "."; import type { Args, Call1W, Call2W, Fn1, GenericFn, GenericResolver, GenericReturn1W, Param0, Return, } from "../../HKT"; import type { Functor$GetTypeClassW } from "../Functor"; import type { HKT$Extract, HKT$GetConstruct, HKT$Mutate } from "../HKT"; /** * Map a function over a {@link Monad} and flatten the result. * * Sig: `, T, U>(f: (x: T) => F, fa: F) => F` */ export type Chain, HKT$GetConstruct>, FA extends Monad> = Call1W< Monad$GetTypeClassW["Flatten"], Call2W["Map"], F, FA> >; interface Resolver extends GenericResolver<[Fn1, Monad], Monad> { on1_: ([f]: Args) => [[HKT$Mutate, Param0>], Return]; on_1: ([, fa]: Args) => [ [Fn1, HKT$GetConstruct>], HKT$GetConstruct, ]; on11: ([f, fa]: Args) => [[], GenericReturn1W>]; } /** * [Fn] Map a function over a {@link Monad} and flatten the result. * * Sig: `, T, U>(f: (x: T) => F, fa: F) => F` */ export default interface ChainFn extends GenericFn { def: ([f, fa]: Args) => typeof f extends ( Fn1, HKT$GetConstruct> ) ? Chain : never; }