/** * @since 1.0.0 */ import * as Dual from "@effect/data/Function" import { type Inspectable, NodeInspectSymbol, toJSON, toString } from "@effect/data/Inspectable" import * as MutableHashMap from "@effect/data/MutableHashMap" import type { Pipeable } from "@effect/data/Pipeable" import { pipeArguments } from "@effect/data/Pipeable" const TypeId: unique symbol = Symbol.for("@effect/data/MutableHashSet") as TypeId /** * @since 1.0.0 * @category symbol */ export type TypeId = typeof TypeId /** * @since 1.0.0 * @category models */ export interface MutableHashSet extends Iterable, Pipeable, Inspectable { readonly [TypeId]: TypeId /** @internal */ readonly keyMap: MutableHashMap.MutableHashMap } const MutableHashSetProto: Omit, "keyMap"> = { [TypeId]: TypeId, [Symbol.iterator](this: MutableHashSet): Iterator { return Array.from(this.keyMap).map(([_]) => _)[Symbol.iterator]() }, toString() { return toString(this.toJSON()) }, toJSON() { return { _id: "MutableHashSet", values: Array.from(this).map(toJSON) } }, [NodeInspectSymbol]() { return this.toJSON() }, pipe() { return pipeArguments(this, arguments) } } const fromHashMap = (keyMap: MutableHashMap.MutableHashMap): MutableHashSet => { const set = Object.create(MutableHashSetProto) set.keyMap = keyMap return set } /** * @since 1.0.0 * @category constructors */ export const empty = (): MutableHashSet => fromHashMap(MutableHashMap.empty()) /** * @since 1.0.0 * @category constructors */ export const fromIterable = (keys: Iterable): MutableHashSet => fromHashMap(MutableHashMap.fromIterable(Array.from(keys).map((k) => [k, true]))) /** * @since 1.0.0 * @category constructors */ export const make = >( ...keys: Keys ): MutableHashSet => fromIterable(keys) /** * @since 1.0.0 * @category elements */ export const add: { (key: V): (self: MutableHashSet) => MutableHashSet (self: MutableHashSet, key: V): MutableHashSet } = Dual.dual< (key: V) => (self: MutableHashSet) => MutableHashSet, (self: MutableHashSet, key: V) => MutableHashSet >(2, (self, key) => (MutableHashMap.set(self.keyMap, key, true), self)) /** * @since 1.0.0 * @category elements */ export const has: { (key: V): (self: MutableHashSet) => boolean (self: MutableHashSet, key: V): boolean } = Dual.dual< (key: V) => (self: MutableHashSet) => boolean, (self: MutableHashSet, key: V) => boolean >(2, (self, key) => MutableHashMap.has(self.keyMap, key)) /** * @since 1.0.0 * @category elements */ export const remove: { (key: V): (self: MutableHashSet) => MutableHashSet (self: MutableHashSet, key: V): MutableHashSet } = Dual.dual< (key: V) => (self: MutableHashSet) => MutableHashSet, (self: MutableHashSet, key: V) => MutableHashSet >(2, (self, key) => (MutableHashMap.remove(self.keyMap, key), self)) /** * @since 1.0.0 * @category elements */ export const size = (self: MutableHashSet): number => MutableHashMap.size(self.keyMap)