import type * as P from "@principia/prelude"; import * as HKT from "@principia/prelude/HKT"; import { identity } from "../Function"; import * as X from "../XPure"; import { Functor } from "./functor"; import type { EIO, URI, V } from "./model"; import { unit } from "./unit"; /* * ------------------------------------------- * Monad EIO * ------------------------------------------- */ export const chain_: (ma: EIO, f: (a: A) => EIO) => EIO = X.chain_; export const chain: (f: (a: A) => EIO) => (ma: EIO) => EIO = X.chain; export const tap_: (fa: EIO, f: (a: A) => EIO) => EIO = X.tap_; export const tap: (f: (a: A) => EIO) => (fa: EIO) => EIO = X.tap; export const flatten = (mma: EIO>): EIO => chain_(mma, identity); /** * @category Monad * @since 1.0.0 */ export const Monad: P.Monad<[URI], V> = HKT.instance({ ...Functor, unit, flatten });