UNPKG

iter-tools-es

Version:
59 lines (44 loc) 1.46 kB
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;