UNPKG

@reactivex/ix-esnext-esm

Version:

The Interactive Extensions for JavaScript

41 lines (39 loc) 1.44 kB
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