UNPKG

fast-iterable

Version:

Provides LINQ-like fluent api operations for iterables and async iterables (ES2018+).

34 lines (33 loc) 1.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mergeIterables = exports.mergeIterators = void 0; const get_next_async_iterator_factory_1 = require("./get-next-async-iterator-factory"); async function getNextValue(asyncIteratorsValues) { return Promise.race(Array.from(asyncIteratorsValues.values())); } async function* mergeIterators(callback, ...iterators) { var _a; const getNextAsyncIteratorValue = (0, get_next_async_iterator_factory_1.getNextAsyncIteratorFactory)(callback); const asyncIteratorsValues = new Map(); iterators.forEach((it, idx) => asyncIteratorsValues.set(idx, getNextAsyncIteratorValue(it, idx))); while (asyncIteratorsValues.size > 0) { const { result, index } = await getNextValue(asyncIteratorsValues); if (result.done) { (_a = iterators[index].return) === null || _a === void 0 ? void 0 : _a.call(iterators[index]); asyncIteratorsValues.delete(index); } else { yield result.value; asyncIteratorsValues.set(index, getNextAsyncIteratorValue(iterators[index], index)); } } } exports.mergeIterators = mergeIterators; function mergeIterables(callback, ...iterables) { if (callback && typeof callback !== 'function') { iterables = [callback, ...iterables]; callback = undefined; } return mergeIterators(callback, ...iterables.map((x) => x[Symbol.asyncIterator]())); } exports.mergeIterables = mergeIterables;