import type { Eq } from "@principia/prelude/Eq"; import type { Separated } from "@principia/prelude/Utils"; import type { Either } from "../Either"; import { identity } from "../Function"; import type { Option } from "../Option"; import { mapOption } from "./filterable"; import { elem } from "./guards"; /* * ------------------------------------------- * Compactable Set * ------------------------------------------- */ export const compact = (E: Eq): ((fa: ReadonlySet>) => ReadonlySet) => mapOption(E)(identity); export const separate = (EE: Eq, EA: Eq) => ( fa: ReadonlySet> ): Separated, ReadonlySet> => { const elemEE = elem(EE); const elemEA = elem(EA); const left: Set = new Set(); const right: Set = new Set(); fa.forEach((e) => { switch (e._tag) { case "Left": if (!elemEE(e.left)(left)) { left.add(e.left); } break; case "Right": if (!elemEA(e.right)(right)) { right.add(e.right); } break; } }); return { left, right }; };