<A>(isEquivalent: Equivalence.Equivalence<A>): Equivalence.Equivalence<
ReadonlyArray<A>
>Creates an Equivalence for arrays based on an element Equivalence. Two
arrays are equivalent when they have the same length and all elements are
pairwise equivalent.
Example (Comparing arrays for equality)
import { Array } from "effect"
const eq = Array.makeEquivalence<number>((a, b) => a === b)
console.log(eq([1, 2, 3], [1, 2, 3])) // trueexport const const makeEquivalence: <A>(
isEquivalent: Equivalence.Equivalence<A>
) => Equivalence.Equivalence<ReadonlyArray<A>>
Creates an Equivalence for arrays based on an element Equivalence. Two
arrays are equivalent when they have the same length and all elements are
pairwise equivalent.
Example (Comparing arrays for equality)
import { Array } from "effect"
const eq = Array.makeEquivalence<number>((a, b) => a === b)
console.log(eq([1, 2, 3], [1, 2, 3])) // true
makeEquivalence: <function (type parameter) A in <A>(isEquivalent: Equivalence.Equivalence<A>): Equivalence.Equivalence<ReadonlyArray<A>>A>(
isEquivalent: Equivalence.Equivalence<A>isEquivalent: import EquivalenceEquivalence.type Equivalence<in A> = (
self: A,
that: A
) => boolean
Represents an equivalence relation over type A.
When to use
Use as a type annotation when you accept or return an equivalence function.
Details
- Returns
boolean: true if values are equivalent, false otherwise
- Must satisfy reflexive, symmetric, and transitive properties
Example (Defining simple number equivalence)
import type { Equivalence } from "effect"
const numberEq: Equivalence.Equivalence<number> = (a, b) => a === b
console.log(numberEq(1, 1)) // true
console.log(numberEq(1, 2)) // false
Example (Defining custom object equivalence)
import type { Equivalence } from "effect"
interface Point {
x: number
y: number
}
const pointEq: Equivalence.Equivalence<Point> = (a, b) =>
a.x === b.x && a.y === b.y
console.log(pointEq({ x: 1, y: 2 }, { x: 1, y: 2 })) // true
Equivalence<function (type parameter) A in <A>(isEquivalent: Equivalence.Equivalence<A>): Equivalence.Equivalence<ReadonlyArray<A>>A>
) => import EquivalenceEquivalence.type Equivalence<in A> = (
self: A,
that: A
) => boolean
Represents an equivalence relation over type A.
When to use
Use as a type annotation when you accept or return an equivalence function.
Details
- Returns
boolean: true if values are equivalent, false otherwise
- Must satisfy reflexive, symmetric, and transitive properties
Example (Defining simple number equivalence)
import type { Equivalence } from "effect"
const numberEq: Equivalence.Equivalence<number> = (a, b) => a === b
console.log(numberEq(1, 1)) // true
console.log(numberEq(1, 2)) // false
Example (Defining custom object equivalence)
import type { Equivalence } from "effect"
interface Point {
x: number
y: number
}
const pointEq: Equivalence.Equivalence<Point> = (a, b) =>
a.x === b.x && a.y === b.y
console.log(pointEq({ x: 1, y: 2 }, { x: 1, y: 2 })) // true
Equivalence<interface ReadonlyArray<T>ReadonlyArray<function (type parameter) A in <A>(isEquivalent: Equivalence.Equivalence<A>): Equivalence.Equivalence<ReadonlyArray<A>>A>> = import EquivalenceEquivalence.function Array<A>(
item: Equivalence<A>
): Equivalence<ReadonlyArray<A>>
Creates an equivalence for arrays where all elements are compared using the same equivalence.
When to use
Use when you need to compare arrays with one equivalence for every element.
Details
- Requires arrays to have the same length; different lengths are never equivalent
- Compares elements positionally, such as index
0 with index 0
- Returns
true only if all corresponding elements are equivalent
- Empty arrays are considered equivalent
- The result is also an equivalence that satisfies reflexive, symmetric, and transitive properties
Example (Comparing number arrays)
import { Equivalence } from "effect"
const numberArrayEq = Equivalence.Array(Equivalence.strictEqual<number>())
console.log(numberArrayEq([1, 2, 3], [1, 2, 3])) // true
console.log(numberArrayEq([1, 2, 3], [1, 2, 4])) // false
console.log(numberArrayEq([1, 2], [1, 2, 3])) // false (different length)
Example (Case-insensitive string array)
import { Equivalence } from "effect"
const caseInsensitive = Equivalence.mapInput(
Equivalence.strictEqual<string>(),
(s: string) => s.toLowerCase()
)
const stringArrayEq = Equivalence.Array(caseInsensitive)
console.log(stringArrayEq(["Hello", "World"], ["HELLO", "WORLD"])) // true
console.log(stringArrayEq(["Hello"], ["Hi"])) // false
console.log(stringArrayEq([], [])) // true (empty arrays)
Array