@jsoldi/hkt
Version:
Higher kinded types for typescript and a few utility monads.
51 lines • 1.78 kB
JavaScript
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