@reactivex/ix-esnext-esm
Version:
The Interactive Extensions for JavaScript
32 lines (30 loc) • 1.26 kB
JavaScript
import { AsyncIterableX } from '../asynciterablex';
import { createGrouping } from './_grouping';
import { identity } from '../../util/identity';
export class JoinAsyncIterable 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);
if (map.has(outerKey)) {
for (const innerElement of map.get(outerKey)) {
yield await this._resultSelector(outerElement, innerElement);
}
}
}
}
}
export function innerJoin(inner, outerSelector, innerSelector, resultSelector) {
return function innerJoinOperatorFunction(outer) {
return new JoinAsyncIterable(outer, inner, outerSelector, innerSelector, resultSelector);
};
}
//# sourceMappingURL=innerjoin.mjs.map