UNPKG

iter-tools-es

Version:
59 lines (44 loc) 1.31 kB
const { isIterable, isWrappable } = require('../../internal/iterable.js'); const { __map } = require('../$map/map.js'); const { __every } = require('../$every/every.js'); const { __zipAll } = require('../$zip-all/zip-all.js'); const { __sliceFromStart } = require('../$slice/slice.js'); const none = Symbol('none'); const zipAllConfig = { filler: none }; const empty = function* () {}; const iterableOrEmpty = value => value == null ? empty() : value; function _deepEqual(values, same, isIterable, depth = 0) { if (__every(values, value => typeof value !== 'string' && isIterable(value))) { for (const stepValues of __zipAll(__map(values, iterableOrEmpty), zipAllConfig)) { if (!_deepEqual(stepValues, same, isIterable, depth + 1)) return false; } } else { const firstValue = values[0]; for (const value of __sliceFromStart(values, 1)) { if (!same(value, firstValue, depth)) return false; } } return true; } exports._deepEqual = _deepEqual; function __deepEqual(values, same = Object.is, coerceNil = true) { return values.length <= 1 ? true : _deepEqual(values, same, coerceNil ? isWrappable : isIterable); } exports.__deepEqual = __deepEqual; function deepEqual(...values) { return __deepEqual(values); } exports.deepEqual = deepEqual;