UNPKG

1.5 kBJavaScriptView Raw
1import { AsyncIterableX } from './asynciterablex';
2// eslint-disable-next-line @typescript-eslint/no-empty-function
3const NEVER_PROMISE = new Promise(() => { });
4function wrapPromiseWithIndex(promise, index) {
5 return promise.then(value => ({ value, index }));
6}
7export class MergeAsyncIterable extends AsyncIterableX {
8 constructor(source) {
9 super();
10 this._source = source;
11 }
12 async *[Symbol.asyncIterator]() {
13 const length = this._source.length;
14 const iterators = new Array(length);
15 const nexts = new Array(length);
16 let active = length;
17 for (let i = 0; i < length; i++) {
18 const iterator = this._source[i][Symbol.asyncIterator]();
19 iterators[i] = iterator;
20 nexts[i] = wrapPromiseWithIndex(iterator.next(), i);
21 }
22 while (active > 0) {
23 const next = Promise.race(nexts);
24 const { value: next$, index } = await next;
25 if (next$.done) {
26 nexts[index] = NEVER_PROMISE;
27 active--;
28 }
29 else {
30 const iterator$ = iterators[index];
31 nexts[index] = wrapPromiseWithIndex(iterator$.next(), index);
32 yield next$.value;
33 }
34 }
35 }
36}
37export function merge(source, ...args) {
38 return new MergeAsyncIterable([source, ...args]);
39}
40export function mergeStatic(...args) {
41 return new MergeAsyncIterable(args);
42}
43
44//# sourceMappingURL=merge.mjs.map