iter-tools-es
Version:
The iterable toolbox
54 lines (44 loc) • 1.14 kB
JavaScript
const {
asyncIterableCurry
} = require('../../internal/async-iterable.js');
const {
asyncParallelEach
} = require('../../internal/async-parallel-each.js');
const {
__asyncPeekerate
} = require('../$peekerate/async-peekerate.js');
const {
__asyncMap
} = require('../$map/async-map.js');
const {
__every
} = require('../$every/every.js');
const {
__asyncToArray
} = require('../$to-array/async-to-array.js');
const isDone = peekr => peekr.done;
async function* __asyncZipAll(sources, {
filler
} = {}) {
const peekrs = await __asyncToArray(__asyncMap(sources, __asyncPeekerate));
let done = __every(peekrs, isDone);
try {
while (!done) {
yield peekrs.map(({
value,
done
}) => done ? filler : value);
await asyncParallelEach(peekrs, peekr => peekr.advance());
done = __every(peekrs, isDone);
}
} finally {
await asyncParallelEach(peekrs, peekr => peekr.return());
}
}
exports.__asyncZipAll = __asyncZipAll;
const asyncZipAll = /*#__PURE__*/asyncIterableCurry(__asyncZipAll, {
variadic: true,
minArgs: 0,
maxArgs: 1
});
exports.asyncZipAll = asyncZipAll;