import type { Eq } from "@principia/prelude/Eq"; import { identity } from "../Function"; import { elem } from "./guards"; /* * ------------------------------------------- * Monad Set * ------------------------------------------- */ export const chain_ = (E: Eq): ((set: ReadonlySet, f: (a: A) => ReadonlySet) => ReadonlySet) => { const elemE = elem(E); return (set, f) => { const r = new Set(); set.forEach((e) => { f(e).forEach((e) => { if (!elemE(e)(r)) { r.add(e); } }); }); return r; }; }; export const chain = (E: Eq) => (f: (a: A) => ReadonlySet) => (set: ReadonlySet) => chain_(E)(set, f); export const flatten: (E: Eq) => (ma: ReadonlySet>) => ReadonlySet = (E) => chain(E)(identity);