1 | import { AsyncIterableX } from './asynciterablex';
|
2 | import { createGrouping } from './_grouping';
|
3 | import { identity } from '../internal/identity';
|
4 | export class JoinAsyncIterable extends AsyncIterableX {
|
5 | constructor(outer, inner, outerSelector, innerSelector, resultSelector) {
|
6 | super();
|
7 | this._outer = outer;
|
8 | this._inner = inner;
|
9 | this._outerSelector = outerSelector;
|
10 | this._innerSelector = innerSelector;
|
11 | this._resultSelector = resultSelector;
|
12 | }
|
13 | async *[Symbol.asyncIterator]() {
|
14 | const map = await createGrouping(this._inner, this._innerSelector, identity);
|
15 | for await (let outerElement of this._outer) {
|
16 | const outerKey = await this._outerSelector(outerElement);
|
17 | if (map.has(outerKey)) {
|
18 | for (let innerElement of map.get(outerKey)) {
|
19 | yield await this._resultSelector(outerElement, innerElement);
|
20 | }
|
21 | }
|
22 | }
|
23 | }
|
24 | }
|
25 | export function innerJoin(outer, inner, outerSelector, innerSelector, resultSelector) {
|
26 | return new JoinAsyncIterable(outer, inner, outerSelector, innerSelector, resultSelector);
|
27 | }
|
28 |
|
29 |
|