UNPKG

@jsoldi/hkt

Version:

Higher kinded types for typescript and a few utility monads.

49 lines 1.52 kB
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