iter-tools-es
Version:
The iterable toolbox
59 lines (44 loc) • 1.46 kB
JavaScript
const {
asyncIsIterable,
asyncIsWrappable
} = require('../../internal/async-iterable.js');
const {
__map
} = require('../$map/map.js');
const {
__every
} = require('../$every/every.js');
const {
__asyncZipAll
} = require('../$zip-all/async-zip-all.js');
const {
__sliceFromStart
} = require('../$slice/slice.js');
const none = Symbol('none');
const zipAllConfig = {
filler: none
};
const asyncEmpty = async function* () {};
const asyncIterableOrEmpty = value => value == null ? asyncEmpty() : value;
async function _asyncDeepEqual(values, same, isIterable, depth = 0) {
if (__every(values, value => typeof value !== 'string' && isIterable(value))) {
for await (const stepValues of __asyncZipAll(__map(values, asyncIterableOrEmpty), zipAllConfig)) {
if (!(await _asyncDeepEqual(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._asyncDeepEqual = _asyncDeepEqual;
function __asyncDeepEqual(values, same = Object.is, coerceNil = true) {
return values.length <= 1 ? true : _asyncDeepEqual(values, same, coerceNil ? asyncIsWrappable : asyncIsIterable);
}
exports.__asyncDeepEqual = __asyncDeepEqual;
function asyncDeepEqual(...values) {
return __asyncDeepEqual(values);
}
exports.asyncDeepEqual = asyncDeepEqual;