@reactivex/ix-esnext-esm
Version:
The Interactive Extensions for JavaScript
41 lines (39 loc) • 1.44 kB
JavaScript
import { AsyncIterableX } from '../asynciterablex';
import { identityAsync } from '../../util/identity';
import { createGrouping } from './_grouping';
export class GroupedAsyncIterable extends AsyncIterableX {
constructor(key, source) {
super();
this.key = key;
this._source = source;
}
async *[Symbol.asyncIterator]() {
for (const item of this._source) {
yield item;
}
}
}
export class GroupByAsyncIterable extends AsyncIterableX {
constructor(source, keySelector, elementSelector, resultSelector) {
super();
this._source = source;
this._keySelector = keySelector;
this._elementSelector = elementSelector;
this._resultSelector = resultSelector;
}
async *[Symbol.asyncIterator]() {
const map = await createGrouping(this._source, this._keySelector, this._elementSelector);
for (const [key, values] of map) {
yield await this._resultSelector(key, values);
}
}
}
export function groupByResultIdentityAsync(key, values) {
return new GroupedAsyncIterable(key, values);
}
export function groupBy(keySelector, elementSelector = identityAsync, resultSelector = groupByResultIdentityAsync) {
return function groupByOperatorFunction(source) {
return new GroupByAsyncIterable(source, keySelector, elementSelector, resultSelector);
};
}
//# sourceMappingURL=groupby.mjs.map