@jsoldi/hkt
Version:
Higher kinded types for typescript and a few utility monads.
49 lines • 1.52 kB
JavaScript
import { curry, pipe } from "../core/utils.js";
const is_monoid = Symbol("is_monoid");
/** Creates an `IMonoid` from an `IMonoidBase`. */
function _monoid(base) {
if (is_monoid in base)
return base;
return pipe(base, base => {
const mappend = curry(base.append);
const concat = (fas) => fas.reduce(base.append, base.empty());
return {
mappend,
concat,
...base
};
}, base => {
const when = (b) => (fa) => b ? fa : base.empty();
const join = (separator) => (fas) => {
if (fas.length === 0)
return base.empty();
const [head, ...tail] = fas;
return tail.reduce((acc, a) => base.append(base.append(acc, separator), a), head);
};
const dual = () => _monoid({
empty: base.empty,
append: (a, b) => base.append(b, a),
});
const liftMonoid = (m) => {
return monoid({
empty: () => m.unit(base.empty()),
append: m.lift2(base.append)
});
};
return {
[is_monoid]: true,
when,
join,
dual,
liftMonoid,
...base,
};
});
}
_monoid.concrete = (empty, append) => _monoid({
empty: () => empty,
append: (a, b) => append(a, b)
});
/** The monoid factory, providing functions for working with monoids. */
export const monoid = _monoid;
//# sourceMappingURL=monoid.js.map