UNPKG

crocks

Version:

A collection of well known Algebraic Datatypes for your utter enjoyment.

57 lines (43 loc) 1.34 kB
/** @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