import type { Monoid } from "@principia/prelude/Monoid"; import type { Ord } from "@principia/prelude/Ord"; import * as A from "../Array"; import { toArray } from "./destructors"; /* * ------------------------------------------- * Foldable Set * ------------------------------------------- */ export const reduce_ = (O: Ord) => { const toArrayO = toArray(O); return (set: ReadonlySet, b: B, f: (b: B, a: A) => B): B => A.reduce_(toArrayO(set), b, f); }; export const reduce = (O: Ord) => (b: B, f: (b: B, a: A) => B) => (set: ReadonlySet) => reduce_(O)(set, b, f); export const foldMap_ = (O: Ord, M: Monoid) => { const toArrayO = toArray(O); return (fa: ReadonlySet, f: (a: A) => M) => A.reduce_(toArrayO(fa), M.nat, (b, a) => M.combine_(b, f(a))); }; export const foldMap = (O: Ord, M: Monoid) => { const foldMapOM_ = foldMap_(O, M); return (f: (a: A) => M) => (fa: ReadonlySet) => foldMapOM_(fa, f); };