pragmatic-fp-ts
Version:
Opinionated functional programming library with easy use in mind
66 lines (65 loc) • 2.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.equals = void 0;
const main_1 = require("./main");
// Deep compare two values. B-u-f-f-e-r comparison not implemented.
// adopted from https://github.com/epoberezkin/fast-deep-equal
const _equals = (a, b) => {
if (a === b)
return true;
if (typeof a !== typeof b)
return false;
if (a && b && typeof a === "object" && typeof b === "object") {
if (a.constructor !== b.constructor)
return false;
if (a instanceof Array) {
if (a.length !== b.length)
return false;
for (let i = 0; i < a.length; ++i)
if (!_equals(a[i], b[i]))
return false;
return true;
}
if (a instanceof Map && b instanceof Map) {
if (a.size !== b.size)
return false;
for (let e of a.entries())
if (!b.has(e[0]) || !_equals(e[1], b.get(e[0])))
return false;
return true;
}
if (a instanceof Set && b instanceof Set) {
if (a.size !== b.size)
return false;
for (let e of a.entries())
if (!b.has(e[0]))
return false;
return true;
}
if (a.constructor === RegExp)
return a.source === b.source && a.flags === b.flags;
if (a.valueOf !== Object.prototype.valueOf)
return a.valueOf === b.valueOf;
if (a.toString !== Object.prototype.toString)
return a.toString() === b.toString();
const keys = Object.keys(a);
if (!_equals(keys, Object.keys(b)))
return false;
for (let i = 0; i < keys.length; ++i) {
const key = keys[i];
if (!_equals(a[key], b[key]))
return false;
}
return true;
}
return a !== a && b !== b; // both NaN
};
function equals(a, b) {
if (arguments.length === 1) {
return (_b) => equals(a, _b);
}
const valA = (0, main_1.when)(main_1.isMonad, main_1.getValue, a);
const valB = (0, main_1.when)(main_1.isMonad, main_1.getValue, b);
return _equals(valA, valB);
}
exports.equals = equals;