UNPKG

1.55 kBJavaScriptView Raw
1import { AsyncIterableX } from './asynciterablex';
2// tslint:disable-next-line:no-empty
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}
37/* tslint:enable:max-line-length */
38export function merge(source, ...args) {
39 return new MergeAsyncIterable([source, ...args]);
40}
41/* tslint:enable:max-line-length */
42export function mergeStatic(...args) {
43 return new MergeAsyncIterable(args);
44}
45
46//# sourceMappingURL=merge.mjs.map