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"