import { filter_, filterMap, filterMap_, fromArray as fromArray_, insert as insertOriginal, insert_, map, map_, reduce, reduce_, remove, remove_, Set, toArray } from "@effect-ts/core/Collections/Immutable/Set" function make_(ord: Ord, eq_?: Equal) { const eq = eq_ ?? > { equals: (x, y) => ord.compare(x, y) === 0 } const fromArray = fromArray_(eq) const concat_ = (set: Set, it: Iterable) => fromArray([...set, ...it]) const insert = insertOriginal(eq) function replace_(set: Set, a: A) { return filter_(set, x => !eq.equals(x, a)) >= insert(a) } return { insert, insert_: insert_(eq), remove: remove(eq), remove_: remove_(eq), reduce: reduce(ord), reduce_: reduce_(ord), replace: (a: A) => (set: Set) => replace_(set, a), replace_, toArray: toArray(ord), fromArray, from: (it: Iterable) => fromArray([...it]), empty: () => new Set(), concat_, concat: (it: Iterable) => (set: Set) => concat_(set, it), // A and B the same, useful when editing elements. map: map(eq), map_: map_(eq), filterMap: filterMap(eq), filterMap_: filterMap_(eq) } // TODO: extend } class Wrapper { wrapped(ord: Ord, eq: Equal) { return make_(ord, eq) } } export interface SetSchemaExtensions extends ReturnType["wrapped"]> {} export const make: ( ord: Ord, eq?: Equal ) => SetSchemaExtensions = make_ export * from "@effect-ts/core/Collections/Immutable/Set"