iter-tools-es
Version:
The iterable toolbox
53 lines (42 loc) • 1.09 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 {
__map
} = require('../$map/map.js');
const {
__some
} = require('../$some/some.js');
const {
__asyncToArray
} = require('../$to-array/async-to-array.js');
const isDone = peekr => peekr.done;
async function* __asyncZip(sources) {
const peekrs = await __asyncToArray(__asyncMap(sources, __asyncPeekerate));
let done = __some(peekrs, isDone);
try {
while (!done) {
yield peekrs.map(({
value
}) => value);
await Promise.all(__map(peekrs, peekr => peekr.advance()));
done = __some(peekrs, isDone);
}
} finally {
await asyncParallelEach(peekrs, peekr => peekr.return());
}
}
exports.__asyncZip = __asyncZip;
const asyncZip = /*#__PURE__*/asyncIterableCurry(__asyncZip, {
variadic: true
});
exports.asyncZip = asyncZip;