crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
57 lines (43 loc) • 1.34 kB
JavaScript
/** @license ISC License (c) copyright 2017 original and current authors */
/** @author Ian Hofmann-Hicks (evil) */
var isSameType = require('./isSameType')
var isSame = require('./isSame')
var hasAlg = require('./hasAlg')
var type = require('./type')
var fl = require('./flNames')
var comp = function (a, b) { return a.valueOf() === b.valueOf(); }
var strats = {
'Array': function (a, b) { return a.length === b.length
&& deepEquals(a, b); },
'Date': function (a, b) { return isSame(a.valueOf(), b.valueOf()); },
'Error': function (a, b) { return a.name === b.name
&& a.message === b.message; },
'Object': function (a, b) { return Object.keys(a).length === Object.keys(b).length
&& deepEquals(a, b); },
'RegExp': function (a, b) { return a.source === b.source
&& a.ignoreCase === b.ignoreCase
&& a.global === b.global
&& a.multiline === b.multiline
&& a.unicode === b.unicode; }
}
function deepEquals(a, b) {
for(var key in a) {
if(!equals(a[key], b[key])) {
return false
}
}
return true
}
function equals(a, b) {
if(isSame(a, b)) {
return true
}
if(!isSameType(a, b)) {
return false
}
if(hasAlg('equals', a)) {
return (b[fl.equals] || b.equals).call(b, a)
}
return (strats[type(a)] || comp)(a, b)
}
module.exports = equals