Hyperlinkv0.8.0-beta.28

Equivalence

Equivalence.combineAllconsteffect/Equivalence.ts:406
<A>(collection: Iterable<Equivalence<A>>): Equivalence<A>

Combines multiple equivalence relations into a single equivalence using logical AND.

When to use

Use when you need to combine many Equivalence instances from an iterable.

Details

Returns true only if all equivalences in the collection return true. The comparison stops at the first equivalence that returns false. Empty collections return an equivalence that always returns true. The result is also an equivalence that satisfies reflexive, symmetric, and transitive properties.

Example (Combining multiple field equivalences)

import { Equivalence } from "effect"

interface Point3D {
  x: number
  y: number
  z: number
}

const xEq = Equivalence.mapInput(
  Equivalence.strictEqual<number>(),
  (p: Point3D) => p.x
)
const yEq = Equivalence.mapInput(
  Equivalence.strictEqual<number>(),
  (p: Point3D) => p.y
)
const zEq = Equivalence.mapInput(
  Equivalence.strictEqual<number>(),
  (p: Point3D) => p.z
)

const point3DEq = Equivalence.combineAll([xEq, yEq, zEq])

const point1 = { x: 1, y: 2, z: 3 }
const point2 = { x: 1, y: 2, z: 3 }
const point3 = { x: 1, y: 2, z: 4 }

console.log(point3DEq(point1, point2)) // true
console.log(point3DEq(point1, point3)) // false (different z)

Example (Handling empty collections)

import { Equivalence } from "effect"

// Empty collection always returns true
const alwaysEq = Equivalence.combineAll([])
console.log(alwaysEq("anything", "else")) // true
export const combineAll = <A>(collection: Iterable<Equivalence<A>>): Equivalence<A> =>
  make((x, y) => {
    for (const equivalence of collection) {
      if (!equivalence(x, y)) {
        return false
      }
    }
    return true
  })
Referenced by 1 symbols