UNPKG

@jsoldi/hkt

Version:

Higher kinded types for typescript and a few utility monads.

51 lines 1.78 kB
import { monad } from "../classes/monad.js"; import { monadTrans } from "../classes/transformer.js"; import { id, memo, pipe } from "../core/utils.js"; /** The lazy monad, providing a set of functions for working with lazy values. */ export const lazy = (() => { return pipe(monad({ unit: a => () => a, bind: (fa, f) => () => f(fa())(), map: (fa, f) => () => f(fa()), }), base => { const run = (fa) => fa(); const runFree = (t) => () => { while (t.right) t = t.value(); return t.value; }; const transformOver = (m) => { const unit = (a) => () => m.unit(a); const bind = (fma, f) => () => m.bind(fma(), a => f(a)()); const map = (fa, f) => () => m.map(fa(), f); const lift = (ma) => () => ma; const wrap = (fa) => () => m.unit(fa()); return { ...monadTrans({ unit, bind, map, lift, wrap }), drop: run, }; }; const transformUnder = (m) => { const unit = (a) => m.unit(() => a); const bind = (ma, f) => m.bind(ma, a => f(a())); const map = (ma, f) => m.map(ma, a => () => f(a())); const lift = (ma) => m.map(ma, a => () => a); const wrap = (fa) => m.unit(() => fa()); const drop = (ma) => m.map(ma, a => a()); return { ...monadTrans({ unit, bind, map, lift, wrap }), drop, }; }; return { ...base, runFree, run, memo, lazy: id, transformOver, transformUnder, }; }); })(); //# sourceMappingURL=lazy.js.map