HashSet.ts
HashSet.ts overview
Section titled “HashSet.ts overview”Stores unique values in an immutable hash set.
A HashSet<A> contains at most one value for each equality class according
to Effect’s Equal and Hash rules. Membership checks, additions, removals,
and set operations return new sets. This module also includes constructors,
union, intersection, difference, subset checks, mapping, filtering, and
reducing helpers.
Since v2.0.0
Exports Grouped by Category
Section titled “Exports Grouped by Category”combinators
Section titled “combinators”difference
Section titled “difference”Creates the difference of two HashSets (elements in the first set that are not in the second).
Example (Finding HashSet differences)
import { HashSet } from "effect"
const set1 = HashSet.make("a", "b", "c")const set2 = HashSet.make("b", "d")const diff = HashSet.difference(set1, set2)
console.log(Array.from(diff).sort()) // ["a", "c"]console.log(HashSet.size(diff)) // 2Signature
declare const difference: { <V1>(that: HashSet<V1>): <V0>(self: HashSet<V0>) => HashSet<V0> <V0, V1>(self: HashSet<V0>, that: HashSet<V1>): HashSet<V0>}Since v2.0.0
intersection
Section titled “intersection”Creates the intersection of two HashSets.
Example (Finding common HashSet values)
import { HashSet } from "effect"
const set1 = HashSet.make("a", "b", "c")const set2 = HashSet.make("b", "c", "d")const common = HashSet.intersection(set1, set2)
console.log(Array.from(common).sort()) // ["b", "c"]console.log(HashSet.size(common)) // 2Signature
declare const intersection: { <V1>(that: HashSet<V1>): <V0>(self: HashSet<V0>) => HashSet<V1 & V0> <V0, V1>(self: HashSet<V0>, that: HashSet<V1>): HashSet<V0 & V1>}Since v2.0.0
Creates the union of two HashSets.
Example (Combining HashSets)
import { HashSet } from "effect"
const set1 = HashSet.make("a", "b")const set2 = HashSet.make("b", "c")const combined = HashSet.union(set1, set2)
console.log(Array.from(combined).sort()) // ["a", "b", "c"]console.log(HashSet.size(combined)) // 3Signature
declare const union: { <V1>(that: HashSet<V1>): <V0>(self: HashSet<V0>) => HashSet<V1 | V0> <V0, V1>(self: HashSet<V0>, that: HashSet<V1>): HashSet<V0 | V1>}Since v2.0.0
constructors
Section titled “constructors”Creates an empty HashSet.
Example (Creating an empty HashSet)
import { HashSet } from "effect"
const set = HashSet.empty<string>()
console.log(HashSet.size(set)) // 0console.log(HashSet.isEmpty(set)) // true
// Add some valuesconst withValues = HashSet.add(HashSet.add(set, "hello"), "world")console.log(HashSet.size(withValues)) // 2Signature
declare const empty: <V = never>() => HashSet<V>Since v2.0.0
fromIterable
Section titled “fromIterable”Creates a HashSet from an iterable collection of values.
Example (Creating a HashSet from an iterable)
import { HashSet } from "effect"
const fromArray = HashSet.fromIterable(["a", "b", "c", "b", "a"])console.log(HashSet.size(fromArray)) // 3
const fromSet = HashSet.fromIterable(new Set([1, 2, 3]))console.log(HashSet.size(fromSet)) // 3
const fromString = HashSet.fromIterable("hello")console.log(Array.from(fromString)) // ["h", "e", "l", "o"]Signature
declare const fromIterable: <V>(values: Iterable<V>) => HashSet<V>Since v2.0.0
Creates a HashSet from a variable number of values.
Example (Creating a HashSet from values)
import { HashSet } from "effect"
const fruits = HashSet.make("apple", "banana", "cherry")console.log(HashSet.size(fruits)) // 3
const numbers = HashSet.make(1, 2, 3, 2, 1) // Duplicates ignoredconsole.log(HashSet.size(numbers)) // 3
const mixed = HashSet.make("hello", 42, true)console.log(HashSet.size(mixed)) // 3Signature
declare const make: <Values extends ReadonlyArray<any>>(...values: Values) => HashSet<Values[number]>Since v2.0.0
elements
Section titled “elements”Checks whether all values in the HashSet satisfy the predicate.
Example (Testing whether every value matches)
import { HashSet } from "effect"
const numbers = HashSet.make(2, 4, 6, 8)
console.log(HashSet.every(numbers, (n) => n % 2 === 0)) // trueconsole.log(HashSet.every(numbers, (n) => n > 5)) // false
const empty = HashSet.empty<number>()console.log(HashSet.every(empty, (n) => n > 0)) // true (vacuously true)Signature
declare const every: { <V>(predicate: Predicate<V>): (self: HashSet<V>) => boolean <V>(self: HashSet<V>, predicate: Predicate<V>): boolean}Since v2.0.0
Checks whether the HashSet contains the specified value.
Example (Checking HashSet membership)
import { Equal, Hash, HashSet } from "effect"
// Works with any type that implements Equal
const set = HashSet.make("apple", "banana", "cherry")
console.log(HashSet.has(set, "apple")) // trueconsole.log(HashSet.has(set, "grape")) // false
class Person implements Equal.Equal { constructor(readonly name: string) {}
[Equal.symbol](other: unknown) { return other instanceof Person && this.name === other.name }
[Hash.symbol](): number { return Hash.string(this.name) }}
const people = HashSet.make(new Person("Alice"), new Person("Bob"))console.log(HashSet.has(people, new Person("Alice"))) // trueSignature
declare const has: { <V>(value: V): (self: HashSet<V>) => boolean; <V>(self: HashSet<V>, value: V): boolean }Since v2.0.0
isSubset
Section titled “isSubset”Checks whether a HashSet is a subset of another HashSet.
Example (Checking subset relationships)
import { HashSet } from "effect"
const small = HashSet.make("a", "b")const large = HashSet.make("a", "b", "c", "d")const other = HashSet.make("x", "y")
console.log(HashSet.isSubset(small, large)) // trueconsole.log(HashSet.isSubset(large, small)) // falseconsole.log(HashSet.isSubset(small, other)) // falseconsole.log(HashSet.isSubset(small, small)) // trueSignature
declare const isSubset: { <V1>(that: HashSet<V1>): <V0>(self: HashSet<V0>) => boolean <V0, V1>(self: HashSet<V0>, that: HashSet<V1>): boolean}Since v2.0.0
Checks whether at least one value in the HashSet satisfies the predicate.
Example (Testing whether some values match)
import { HashSet } from "effect"
const numbers = HashSet.make(1, 2, 3, 4, 5)
console.log(HashSet.some(numbers, (n) => n > 3)) // trueconsole.log(HashSet.some(numbers, (n) => n > 10)) // false
const empty = HashSet.empty<number>()console.log(HashSet.some(empty, (n) => n > 0)) // falseSignature
declare const some: { <V>(predicate: Predicate<V>): (self: HashSet<V>) => boolean <V>(self: HashSet<V>, predicate: Predicate<V>): boolean}Since v2.0.0
filtering
Section titled “filtering”filter
Section titled “filter”Filters the HashSet keeping only values that satisfy the predicate.
Example (Filtering HashSet values)
import { HashSet } from "effect"
const numbers = HashSet.make(1, 2, 3, 4, 5, 6)const evens = HashSet.filter(numbers, (n) => n % 2 === 0)
console.log(Array.from(evens).sort()) // [2, 4, 6]console.log(HashSet.size(evens)) // 3Signature
declare const filter: { <V, U extends V>(refinement: Refinement<NoInfer<V>, U>): (self: HashSet<V>) => HashSet<U> <V>(predicate: Predicate<NoInfer<V>>): (self: HashSet<V>) => HashSet<V> <V, U extends V>(self: HashSet<V>, refinement: Refinement<V, U>): HashSet<U> <V>(self: HashSet<V>, predicate: Predicate<V>): HashSet<V>}Since v2.0.0
folding
Section titled “folding”reduce
Section titled “reduce”Reduces the HashSet to a single value by iterating through the values and applying an accumulator function.
Example (Reducing HashSet values)
import { HashSet } from "effect"
const numbers = HashSet.make(1, 2, 3, 4, 5)const sum = HashSet.reduce(numbers, 0, (acc, n) => acc + n)
console.log(sum) // 15
const strings = HashSet.make("a", "b", "c")const concatenated = HashSet.reduce(strings, "", (acc, s) => acc + s)console.log(concatenated) // Order may vary: "abc", "bac", etc.Signature
declare const reduce: { <V, U>(zero: U, f: (accumulator: U, value: V) => U): (self: HashSet<V>) => U <V, U>(self: HashSet<V>, zero: U, f: (accumulator: U, value: V) => U): U}Since v2.0.0
getters
Section titled “getters”isEmpty
Section titled “isEmpty”Checks whether the HashSet is empty.
Example (Checking whether a HashSet is empty)
import { HashSet } from "effect"
const empty = HashSet.empty<string>()console.log(HashSet.isEmpty(empty)) // true
const nonEmpty = HashSet.make("a")console.log(HashSet.isEmpty(nonEmpty)) // falseSignature
declare const isEmpty: <V>(self: HashSet<V>) => booleanSince v4.0.0
Returns the number of values in the HashSet.
Example (Getting the HashSet size)
import { HashSet } from "effect"
const empty = HashSet.empty<string>()console.log(HashSet.size(empty)) // 0
const small = HashSet.make("a", "b")console.log(HashSet.size(small)) // 2
const withDuplicates = HashSet.fromIterable(["x", "y", "z", "x", "y"])console.log(HashSet.size(withDuplicates)) // 3Signature
declare const size: <V>(self: HashSet<V>) => numberSince v2.0.0
guards
Section titled “guards”isHashSet
Section titled “isHashSet”Checks whether a value is a HashSet.
Example (Checking for a HashSet)
import { HashSet } from "effect"
const set = HashSet.make(1, 2, 3)const array = [1, 2, 3]
console.log(HashSet.isHashSet(set)) // trueconsole.log(HashSet.isHashSet(array)) // falseconsole.log(HashSet.isHashSet(null)) // falseSignature
declare const isHashSet: { <V>(u: Iterable<V>): u is HashSet<V>; (u: unknown): u is HashSet<unknown> }Since v2.0.0
mapping
Section titled “mapping”Maps each value in the HashSet using the provided function.
Example (Mapping HashSet values)
import { HashSet } from "effect"
const numbers = HashSet.make(1, 2, 3)const doubled = HashSet.map(numbers, (n) => n * 2)
console.log(Array.from(doubled).sort()) // [2, 4, 6]console.log(HashSet.size(doubled)) // 3
// Mapping can reduce size if function produces duplicatesconst strings = HashSet.make("apple", "banana", "cherry")const lengths = HashSet.map(strings, (s) => s.length)console.log(Array.from(lengths).sort()) // [5, 6] (apple=5, banana=6, cherry=6)Signature
declare const map: { <V, U>(f: (value: V) => U): (self: HashSet<V>) => HashSet<U> <V, U>(self: HashSet<V>, f: (value: V) => U): HashSet<U>}Since v2.0.0
models
Section titled “models”HashSet (interface)
Section titled “HashSet (interface)”A HashSet is an immutable set data structure that provides efficient storage and retrieval of unique values. It uses a HashMap internally for optimal performance.
Example (Creating and updating a HashSet)
import { HashSet } from "effect"
// Create a HashSetconst set = HashSet.make("apple", "banana", "cherry")
// Check membershipconsole.log(HashSet.has(set, "apple")) // trueconsole.log(HashSet.has(set, "grape")) // false
// Add values (returns new HashSet)const updated = HashSet.add(set, "grape")console.log(HashSet.size(updated)) // 4
// Remove values (returns new HashSet)const smaller = HashSet.remove(set, "banana")console.log(HashSet.size(smaller)) // 2Signature
export interface HashSet<out Value> extends Iterable<Value>, Equal, Pipeable, Inspectable { readonly [TypeId]: typeof TypeId}Since v2.0.0
mutations
Section titled “mutations”Adds a value to the HashSet, returning a new HashSet.
Example (Adding values to a HashSet)
import { HashSet } from "effect"
const set = HashSet.make("a", "b")const withC = HashSet.add(set, "c")
console.log(HashSet.size(set)) // 2 (original unchanged)console.log(HashSet.size(withC)) // 3console.log(HashSet.has(withC, "c")) // true
// Adding existing value has no effectconst same = HashSet.add(set, "a")console.log(HashSet.size(same)) // 2Signature
declare const add: { <V>(value: V): (self: HashSet<V>) => HashSet<V>; <V>(self: HashSet<V>, value: V): HashSet<V> }Since v2.0.0
remove
Section titled “remove”Removes a value from the HashSet, returning a new HashSet.
Example (Removing values from a HashSet)
import { HashSet } from "effect"
const set = HashSet.make("a", "b", "c")const withoutB = HashSet.remove(set, "b")
console.log(HashSet.size(set)) // 3 (original unchanged)console.log(HashSet.size(withoutB)) // 2console.log(HashSet.has(withoutB, "b")) // false
// Removing non-existent value has no effectconst same = HashSet.remove(set, "d")console.log(HashSet.size(same)) // 3Signature
declare const remove: { <V>(value: V): (self: HashSet<V>) => HashSet<V>; <V>(self: HashSet<V>, value: V): HashSet<V> }Since v2.0.0
HashSet (namespace)
Section titled “HashSet (namespace)”The HashSet namespace contains type-level utilities and helper types for working with HashSet instances.
Example (Extracting value types from a HashSet)
import { HashSet } from "effect"
// Create a concrete HashSet for type extractionconst fruits = HashSet.make("apple", "banana", "cherry")
// Extract the value type for reusetype Fruit = HashSet.HashSet.Value<typeof fruits> // string
// Use extracted type in functionsconst processFruit = (fruit: Fruit) => { return `Processing ${fruit}`}Since v2.0.0
Value (type alias)
Section titled “Value (type alias)”Extracts the element type from a HashSet.
Details
For HashSet.HashSet<A>, HashSet.Value<...> resolves to A.
Example (Extracting a HashSet value type)
import { HashSet } from "effect"
const numbers = HashSet.make(1, 2, 3, 4, 5)
// Extract the value typetype NumberType = HashSet.HashSet.Value<typeof numbers> // number
const processNumber = (n: NumberType) => n * 2Signature
type Value<T> = T extends HashSet<infer V> ? V : neverSince v4.0.0