asyncerator
Version:
Provide supporting types for AsyncIterable/AsyncIterableIterators, promisified stream.pipeline implementation, and Array-like utility operators, sources and sinks.
33 lines (32 loc) • 2.32 kB
JavaScript
// src/source/merge.ts
import from from "../asyncerator.mjs";
async function createPending(asyncerator, index) {
const iterator = asyncerator[Symbol.asyncIterator]();
return { index, iterator, result: await iterator.next() };
}
async function* merge(...iterators) {
const wrappedIterators = iterators.map(from);
const pending = wrappedIterators.map(createPending);
const indexMap = wrappedIterators.map((_, index) => index);
while (pending.length > 0) {
const { result, iterator, index } = await Promise.race(pending);
if (result.done === true) {
pending.splice(indexMap[index], 1);
for (let position = index + 1; position < indexMap.length; position++) {
indexMap[position] = (indexMap[position] ?? 0) - 1;
}
} else {
if (result.value[Symbol.asyncIterator] === void 0) {
yield result.value;
} else {
pending.push(createPending(from(result.value), indexMap.length));
indexMap.push(pending.length - 1);
}
pending[indexMap[index]] = createPending(iterator, index);
}
}
}
export {
merge as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3NvdXJjZS9tZXJnZS50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxPQUFPLFVBQWdEO0FBRXZELGVBQWUsY0FBaUIsYUFBNkIsT0FBZTtBQUMxRSxRQUFNLFdBQVcsWUFBWSxPQUFPLGFBQWEsRUFBRTtBQUNuRCxTQUFPLEVBQUUsT0FBTyxVQUFVLFFBQVEsTUFBTSxTQUFTLEtBQUssRUFBRTtBQUMxRDtBQVFBLGdCQUFPLFNBQW9DLFdBQXVFO0FBQ2hILFFBQU0sbUJBQW1CLFVBQVUsSUFBSSxJQUFJO0FBRTNDLFFBQU0sVUFBVSxpQkFBaUIsSUFBSSxhQUFhO0FBQ2xELFFBQU0sV0FBVyxpQkFBaUIsSUFBSSxDQUFDLEdBQUcsVUFBVSxLQUFLO0FBRXpELFNBQU8sUUFBUSxTQUFTLEdBQUc7QUFFekIsVUFBTSxFQUFFLFFBQVEsVUFBVSxNQUFNLElBQUksTUFBTSxRQUFRLEtBQUssT0FBTztBQUU5RCxRQUFJLE9BQU8sU0FBUyxNQUFNO0FBR3hCLGNBQVEsT0FBTyxTQUFTLEtBQUssR0FBYSxDQUFDO0FBQzNDLGVBQVMsV0FBVyxRQUFRLEdBQUcsV0FBVyxTQUFTLFFBQVEsWUFBWTtBQUNyRSxpQkFBUyxRQUFRLEtBQUssU0FBUyxRQUFRLEtBQUssS0FBSztBQUFBLE1BQ25EO0FBQUEsSUFDRixPQUFPO0FBRUwsVUFBSyxPQUFPLE1BQW1DLE9BQU8sYUFBYSxNQUFNLFFBQVc7QUFDbEYsY0FBTSxPQUFPO0FBQUEsTUFDZixPQUFPO0FBRUwsZ0JBQVEsS0FBSyxjQUFjLEtBQUssT0FBTyxLQUFpQyxHQUFHLFNBQVMsTUFBTSxDQUFDO0FBQzNGLGlCQUFTLEtBQUssUUFBUSxTQUFTLENBQUM7QUFBQSxNQUNsQztBQUlBLGNBQVEsU0FBUyxLQUFLLENBQVcsSUFBSSxjQUFjLFVBQVUsS0FBSztBQUFBLElBQ3BFO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=