Skip to content
Effect Days 2026 Get your ticket

Equivalence

This module provides an implementation of the Equivalence type class, which defines a binary relation that is reflexive, symmetric, and transitive. In other words, it defines a notion of equivalence between values of a certain type. These properties are also known in mathematics as an "equivalence relation".

20 exports Added in v2.0.0 Source

Combinators

array

Added in v2.0.0 Source

Creates a new Equivalence for an array of values based on a given Equivalence for the elements of the array.

Signature

declare function array<A>(item: Equivalence<A>): Equivalence<readonly Array<A>>

struct

Added in v2.0.0 Source

Given a struct of Equivalences returns a new Equivalence that compares values of a struct by applying each Equivalence to the corresponding property of the struct.

Signature

declare function struct<R extends Record<string, Equivalence<any>>>(fields: R): Equivalence<{ [K in string | number | symbol]: [R[K]] extends [Equivalence<A>] ? A : never }>

tuple

Added in v2.0.0 Source

Similar to Promise.all but operates on Equivalences.

Given a tuple of Equivalences returns a new Equivalence that compares values of a tuple by applying each Equivalence to the corresponding element of the tuple.

Signature

declare function tuple<T extends readonly Array<Equivalence<any>>>(...elements: T): Equivalence<Readonly<{ [I in string | number | symbol]: [T[I]] extends [Equivalence<A>] ? A : never }>>

Example

[Equivalence<A>, Equivalence<B>, ...] -> Equivalence<[A, B, ...]>

Combining

all

Added in v2.0.0 Source

Signature

declare function all<A>(collection: Iterable<Equivalence<A>>): Equivalence<readonly Array<A>>

combine

Added in v2.0.0 Source

Signature

declare const combine: {
<A>(that: Equivalence<A>): (self: Equivalence<A>) => Equivalence<A>;
<A>(self: Equivalence<A>, that: Equivalence<A>): Equivalence<A>;
}

combineAll

Added in v2.0.0 Source

Signature

declare function combineAll<A>(collection: Iterable<Equivalence<A>>): Equivalence<A>

combineMany

Added in v2.0.0 Source

Signature

declare const combineMany: {
<A>(collection: Iterable<Equivalence<A>>): (self: Equivalence<A>) => Equivalence<A>;
<A>(self: Equivalence<A>, collection: Iterable<Equivalence<A>>): Equivalence<A>;
}

product

Added in v2.0.0 Source

Signature

declare const product: {
<B>(that: Equivalence<B>): <A>(self: Equivalence<A>) => Equivalence<readonly [A, B]>;
<A, B>(self: Equivalence<A>, that: Equivalence<B>): Equivalence<readonly [A, B]>;
}

productMany

Added in v2.0.0 Source

Signature

declare function productMany<A>(self: Equivalence<A>, collection: Iterable<Equivalence<A>>): Equivalence<readonly [A, A]>

Constructors

make

Added in v2.0.0 Source

Signature

declare function make<A>(isEquivalent: (self: A, that: A) => boolean): Equivalence<A>

strict

Added in v2.0.0 Source

Return an Equivalence that uses strict equality (===) to compare values.

Signature

declare const strict: <A>() => Equivalence<A>

Instances

bigint

Added in v2.0.0 Source

Signature

declare const bigint: Equivalence<bigint>

boolean

Added in v2.0.0 Source

Signature

declare const boolean: Equivalence<boolean>

Date

Added in v2.0.0 Source

Signature

declare const Date: Equivalence<Date>

number

Added in v2.0.0 Source

Signature

declare const number: Equivalence<number>

string

Added in v2.0.0 Source

Signature

declare const string: Equivalence<string>

symbol

Added in v2.0.0 Source

Signature

declare const symbol: Equivalence<symbol>

Mapping

mapInput

Added in v2.0.0 Source

Signature

declare const mapInput: {
<B, A>(f: (b: B) => A): (self: Equivalence<A>) => Equivalence<B>;
<A, B>(self: Equivalence<A>, f: (b: B) => A): Equivalence<B>;
}

Type Class

Equivalence interface

Added in v2.0.0 Source

Signature

interface Equivalence<in A> {
(self: A, that: A): boolean;
}

Type Lambdas

EquivalenceTypeLambda interface

Added in v2.0.0 Source

Signature

interface EquivalenceTypeLambda extends TypeLambda {
readonly type: Equivalence<unknown>;
}