![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/lavocat.quebec/private_html/node_modules/effect/src/ |
/**
* @since 2.0.0
*/
import type { Equivalence } from "./Equivalence.js"
import * as Hash from "./Hash.js"
import { hasProperty } from "./Predicate.js"
import { structuralRegionState } from "./Utils.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): boolean {
if (self === that) {
return true
}
const selfType = typeof self
if (selfType !== typeof that) {
return false
}
if (selfType === "object" || selfType === "function") {
if (self !== null && that !== null) {
if (isEqual(self) && isEqual(that)) {
if (Hash.hash(self) === Hash.hash(that) && self[symbol](that)) {
return true
} else {
return structuralRegionState.enabled && structuralRegionState.tester
? structuralRegionState.tester(self, that)
: false
}
} else if (self instanceof Date && that instanceof Date) {
return self.toISOString() === that.toISOString()
} else if (self instanceof URL && that instanceof URL) {
return self.href === that.href
}
}
if (structuralRegionState.enabled) {
if (Array.isArray(self) && Array.isArray(that)) {
return self.length === that.length && self.every((v, i) => compareBoth(v, that[i]))
}
if (Object.getPrototypeOf(self) === Object.prototype && Object.getPrototypeOf(self) === Object.prototype) {
const keysSelf = Object.keys(self as any)
const keysThat = Object.keys(that as any)
if (keysSelf.length === keysThat.length) {
for (const key of keysSelf) {
// @ts-expect-error
if (!(key in that && compareBoth(self[key], that[key]))) {
return structuralRegionState.tester ? structuralRegionState.tester(self, that) : false
}
}
return true
}
}
return structuralRegionState.tester ? structuralRegionState.tester(self, that) : false
}
}
return structuralRegionState.enabled && structuralRegionState.tester
? structuralRegionState.tester(self, that)
: 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