iter-tools-es
Version:
The iterable toolbox
59 lines (44 loc) • 1.31 kB
JavaScript
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;