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 { Sync, URI, V } from "./model"; import { unit } from "./unit"; /* * ------------------------------------------- * Monad Sync * ------------------------------------------- */ export const chain_: (ma: Sync, f: (a: A) => Sync) => Sync = X.chain_; export const chain: (f: (a: A) => Sync) => (ma: Sync) => Sync = X.chain; export const flatten: (mma: Sync>) => Sync = chain(identity); export const tap_: (ma: Sync, f: (a: A) => Sync) => Sync = X.tap_; export const tap: (f: (a: A) => Sync) => (ma: Sync) => Sync = X.tap; export const Monad: P.Monad<[URI], V> = HKT.instance({ ...Functor, unit, flatten });