veffect
Version:
powerful TypeScript validation library built on the robust foundation of Effect combining exceptional type safety, high performance, and developer experience. Taking inspiration from Effect's functional principles, VEffect delivers a balanced approach tha
66 lines (59 loc) • 1.4 kB
text/typescript
/**
* @since 2.0.0
*/
import type { Equivalence } from "./Equivalence.js"
import * as Hash from "./Hash.js"
import { hasProperty } from "./Predicate.js"
/**
* @since 2.0.0
* @category symbols
*/
export const symbol: unique symbol = Symbol.for("effect/Equal")
/**
* @since 2.0.0
* @category models
*/
export interface Equal extends Hash.Hash {
[symbol](that: Equal): boolean
}
/**
* @since 2.0.0
* @category equality
*/
export function equals<B>(that: B): <A>(self: A) => boolean
export function equals<A, B>(self: A, that: B): boolean
export function equals(): any {
if (arguments.length === 1) {
return (self: unknown) => compareBoth(self, arguments[0])
}
return compareBoth(arguments[0], arguments[1])
}
function compareBoth(self: unknown, that: unknown) {
if (self === that) {
return true
}
const selfType = typeof self
if (selfType !== typeof that) {
return false
}
if (
(selfType === "object" || selfType === "function") &&
self !== null &&
that !== null
) {
if (isEqual(self) && isEqual(that)) {
return Hash.hash(self) === Hash.hash(that) && self[symbol](that)
}
}
return false
}
/**
* @since 2.0.0
* @category guards
*/
export const isEqual = (u: unknown): u is Equal => hasProperty(u, symbol)
/**
* @since 2.0.0
* @category instances
*/
export const equivalence: <A>() => Equivalence<A> = () => equals