import { OperatorFunction } from '../../interfaces'; import { IterableX } from '../../iterable/iterablex'; import { GroupByIterable, GroupedIterable, groupByResultIdentity } from '../groupby'; import { identity } from '../../internal/identity'; export function groupBy( keySelector: (value: TSource) => TKey ): OperatorFunction>; export function groupBy( keySelector: (value: TSource) => TKey, elementSelector?: (value: TSource) => TValue ): OperatorFunction>; export function groupBy( keySelector: (value: TSource) => TKey, elementSelector?: (value: TSource) => TValue, resultSelector?: (key: TKey, values: Iterable) => TResult ): OperatorFunction; export function groupBy( keySelector: (value: TSource) => TKey, elementSelector: (value: TSource) => TValue = identity, resultSelector: (key: TKey, values: Iterable) => TResult = groupByResultIdentity ): OperatorFunction { return function groupByOperatorFunction(source: Iterable): IterableX { return new GroupByIterable( source, keySelector, elementSelector, resultSelector ); }; }