effect
Version:
The missing standard library for TypeScript, for writing production-grade software.
151 lines (136 loc) • 3.78 kB
text/typescript
/**
* @since 2.0.0
*/
import * as Dual from "./Function.js"
import { format, type Inspectable, NodeInspectSymbol, toJSON } from "./Inspectable.js"
import * as MutableHashMap from "./MutableHashMap.js"
import type { Pipeable } from "./Pipeable.js"
import { pipeArguments } from "./Pipeable.js"
const TypeId: unique symbol = Symbol.for("effect/MutableHashSet") as TypeId
/**
* @since 2.0.0
* @category symbol
*/
export type TypeId = typeof TypeId
/**
* @since 2.0.0
* @category models
*/
export interface MutableHashSet<out V> extends Iterable<V>, Pipeable, Inspectable {
readonly [TypeId]: TypeId
/** @internal */
readonly keyMap: MutableHashMap.MutableHashMap<V, boolean>
}
const MutableHashSetProto: Omit<MutableHashSet<unknown>, "keyMap"> = {
[TypeId]: TypeId,
[Symbol.iterator](this: MutableHashSet<unknown>): Iterator<unknown> {
return Array.from(this.keyMap).map(([_]) => _)[Symbol.iterator]()
},
toString() {
return format(this.toJSON())
},
toJSON() {
return {
_id: "MutableHashSet",
values: Array.from(this).map(toJSON)
}
},
[NodeInspectSymbol]() {
return this.toJSON()
},
pipe() {
return pipeArguments(this, arguments)
}
}
const fromHashMap = <V>(keyMap: MutableHashMap.MutableHashMap<V, boolean>): MutableHashSet<V> => {
const set = Object.create(MutableHashSetProto)
set.keyMap = keyMap
return set
}
/**
* @since 2.0.0
* @category constructors
*/
export const empty = <K = never>(): MutableHashSet<K> => fromHashMap(MutableHashMap.empty())
/**
* Creates a new `MutableHashSet` from an iterable collection of values.
*
* @since 2.0.0
* @category constructors
*/
export const fromIterable = <K = never>(keys: Iterable<K>): MutableHashSet<K> =>
fromHashMap(MutableHashMap.fromIterable(Array.from(keys).map((k) => [k, true])))
/**
* @since 2.0.0
* @category constructors
*/
export const make = <Keys extends ReadonlyArray<unknown>>(
...keys: Keys
): MutableHashSet<Keys[number]> => fromIterable(keys)
/**
* @since 2.0.0
* @category elements
*/
export const add: {
/**
* @since 2.0.0
* @category elements
*/
<V>(key: V): (self: MutableHashSet<V>) => MutableHashSet<V>
/**
* @since 2.0.0
* @category elements
*/
<V>(self: MutableHashSet<V>, key: V): MutableHashSet<V>
} = Dual.dual<
<V>(key: V) => (self: MutableHashSet<V>) => MutableHashSet<V>,
<V>(self: MutableHashSet<V>, key: V) => MutableHashSet<V>
>(2, (self, key) => (MutableHashMap.set(self.keyMap, key, true), self))
/**
* @since 2.0.0
* @category elements
*/
export const has: {
/**
* @since 2.0.0
* @category elements
*/
<V>(key: V): (self: MutableHashSet<V>) => boolean
/**
* @since 2.0.0
* @category elements
*/
<V>(self: MutableHashSet<V>, key: V): boolean
} = Dual.dual<
<V>(key: V) => (self: MutableHashSet<V>) => boolean,
<V>(self: MutableHashSet<V>, key: V) => boolean
>(2, (self, key) => MutableHashMap.has(self.keyMap, key))
/**
* @since 2.0.0
* @category elements
*/
export const remove: {
/**
* @since 2.0.0
* @category elements
*/
<V>(key: V): (self: MutableHashSet<V>) => MutableHashSet<V>
/**
* @since 2.0.0
* @category elements
*/
<V>(self: MutableHashSet<V>, key: V): MutableHashSet<V>
} = Dual.dual<
<V>(key: V) => (self: MutableHashSet<V>) => MutableHashSet<V>,
<V>(self: MutableHashSet<V>, key: V) => MutableHashSet<V>
>(2, (self, key) => (MutableHashMap.remove(self.keyMap, key), self))
/**
* @since 2.0.0
* @category elements
*/
export const size = <V>(self: MutableHashSet<V>): number => MutableHashMap.size(self.keyMap)
/**
* @since 2.0.0
* @category elements
*/
export const clear = <V>(self: MutableHashSet<V>): MutableHashSet<V> => (MutableHashMap.clear(self.keyMap), self)