@reactivex/ix-esnext-esm
Version:
The Interactive Extensions for JavaScript
33 lines (31 loc) • 1.32 kB
JavaScript
import { AsyncIterableX } from '../asynciterablex';
import { createGrouping } from './_grouping';
import { empty } from '../empty';
import { from } from '../from';
import { identity } from '../../util/identity';
export class GroupJoinAsyncIterable extends AsyncIterableX {
constructor(outer, inner, outerSelector, innerSelector, resultSelector) {
super();
this._outer = outer;
this._inner = inner;
this._outerSelector = outerSelector;
this._innerSelector = innerSelector;
this._resultSelector = resultSelector;
}
async *[Symbol.asyncIterator]() {
const map = await createGrouping(this._inner, this._innerSelector, identity);
for await (const outerElement of this._outer) {
const outerKey = await this._outerSelector(outerElement);
const innerElements = map.has(outerKey)
? map.get(outerKey)
: empty();
yield await this._resultSelector(outerElement, from(innerElements));
}
}
}
export function groupJoin(inner, outerSelector, innerSelector, resultSelector) {
return function groupJoinOperatorFunction(outer) {
return new GroupJoinAsyncIterable(outer, inner, outerSelector, innerSelector, resultSelector);
};
}
//# sourceMappingURL=groupjoin.mjs.map