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);
};