// ets_tracing: off import { pipe } from "../../Function/index.js" import type { Any } from "../Any/index.js" import type { Covariant } from "../Covariant/index.js" import type * as HKT from "../HKT/index.js" import type { Monad } from "../Monad/index.js" import { chainF } from "./chain.js" import { succeedF } from "./succeed.js" export function doF( F: Any & Covariant ): HKT.Kind< F, C, HKT.Initial, HKT.Initial, HKT.Initial, HKT.Initial, HKT.Initial, HKT.Initial, HKT.Initial, HKT.Initial, {} > export function doF(F: Any> & Covariant>): HKT.HKT { return succeedF(F)({}) } export function bindF( F: Monad ): ( tag: Exclude, f: (a: BK) => HKT.Kind ) => ( fa: HKT.Kind< F, C, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, BK > ) => HKT.Kind< F, C, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, BK & { [k in BN]: BA } > export function bindF( F: Monad> ): ( tag: Exclude, f: (_: K) => HKT.HKT ) => (mk: HKT.HKT) => HKT.HKT { return ( tag: Exclude, f: (_: K) => HKT.HKT ) => (mk: HKT.HKT): HKT.HKT => pipe( mk, chainF(F)((k) => pipe( f(k), F.map((a) => Object.assign({}, k, { [tag]: a } as { [k in N]: A }) ) ) ) ) } export function letF( F: Monad ): ( tag: Exclude, f: (a: BK) => BA ) => ( fa: HKT.Kind ) => HKT.Kind export function letF( F: Monad> ): ( tag: Exclude, f: (_: K) => A ) => (mk: HKT.HKT) => HKT.HKT { return (tag: Exclude, f: (_: K) => A) => (mk: HKT.HKT): HKT.HKT => pipe( mk, F.map((k) => Object.assign({}, k, { [tag]: f(k) } as { [k in N]: A }) ) ) }