import { identity, pipe } from "../../Function"; import { map } from "./functor"; import { isFailure } from "./guards"; import type { Exit } from "./model"; /* * ------------------------------------------- * Monad Exit * ------------------------------------------- */ export const chain_ = (ma: Exit, f: (a: A) => Exit): Exit => isFailure(ma) ? ma : f(ma.value); export const chain = (f: (a: A) => Exit) => (fa: Exit): Exit => chain_(fa, f); export const flatten = (mma: Exit>): Exit => chain_(mma, identity); export const tap_ = (ma: Exit, f: (a: A) => Exit): Exit => chain_(ma, (a) => pipe( f(a), map(() => a) ) ); export const tap = (f: (a: A) => Exit) => (ma: Exit): Exit => tap_(ma, f);