1 | import { AsyncIterableX } from './asynciterablex';
|
2 | import { identityAsync } from '../internal/identity';
|
3 | import { createGrouping } from './_grouping';
|
4 | export class GroupedAsyncIterable extends AsyncIterableX {
|
5 | constructor(key, source) {
|
6 | super();
|
7 | this.key = key;
|
8 | this._source = source;
|
9 | }
|
10 | async *[Symbol.asyncIterator]() {
|
11 | for (let item of this._source) {
|
12 | yield item;
|
13 | }
|
14 | }
|
15 | }
|
16 | export class GroupByAsyncIterable extends AsyncIterableX {
|
17 | constructor(source, keySelector, elementSelector, resultSelector) {
|
18 | super();
|
19 | this._source = source;
|
20 | this._keySelector = keySelector;
|
21 | this._elementSelector = elementSelector;
|
22 | this._resultSelector = resultSelector;
|
23 | }
|
24 | async *[Symbol.asyncIterator]() {
|
25 | const map = await createGrouping(this._source, this._keySelector, this._elementSelector);
|
26 | for (let [key, values] of map) {
|
27 | yield await this._resultSelector(key, values);
|
28 | }
|
29 | }
|
30 | }
|
31 | export function groupByResultIdentityAsync(key, values) {
|
32 | return new GroupedAsyncIterable(key, values);
|
33 | }
|
34 | export function groupBy(source, keySelector, elementSelector = identityAsync, resultSelector = groupByResultIdentityAsync) {
|
35 | return new GroupByAsyncIterable(source, keySelector, elementSelector, resultSelector);
|
36 | }
|
37 |
|
38 |
|