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