@benev/slate
Version:
frontend web stuff
50 lines (38 loc) • 1.21 kB
text/typescript
import {is} from "../../is.js"
export const deepEqual = (alpha: any, bravo: any): boolean => {
function recurse(alpha: any, bravo: any, parents: object[]) {
if (!is.object(alpha) || !is.object(bravo))
return alpha === bravo
if (parents.includes(alpha))
throw new Error(`forbidden circularity detected in deep equal comparison`)
const newParents = [...parents, alpha]
if (alpha instanceof Map && bravo instanceof Map) {
if (alpha.size !== bravo.size)
return false
for (const [key, val] of alpha)
if (!bravo.has(key) || !recurse(val, bravo.get(key), newParents))
return false
}
else if (alpha instanceof Set && bravo instanceof Set) {
if (alpha.size !== bravo.size)
return false
for (const item of alpha)
if (!Array.from(bravo).some(bItem => recurse(item, bItem, newParents)))
return false
}
else {
const keys1 = Object.keys(alpha)
const keys2 = Object.keys(bravo)
if (keys1.length !== keys2.length)
return false
for (const key of keys1) {
if (!keys2.includes(key))
return false
if (!recurse(alpha[key], bravo[key], newParents))
return false
}
}
return true
}
return recurse(alpha, bravo, [])
}