import { Enumerable, IEnumerable } from '../enumerable' import { EqualityComparer, IEqualityComparer } from '../equality-comparer' import { Grouping, IGrouping } from '../grouping' import * as utils from '../utils' import * as assistance from './assistance' export function groupBy( source: Iterable, keySelector: (item: TSource) => TKey, elementSelector?: (item: TSource) => TElement, comparer?: IEqualityComparer ): IEnumerable> { utils.throws.ThrowIfNull('source', source) utils.throws.ThrowIfNull('keySelector', keySelector) let _elementSelector: any = elementSelector || ((x) => x) comparer = comparer || EqualityComparer.Default() return Enumerable.AsEnumerable( assistance .group(source, keySelector, _elementSelector, (x, y) => comparer.Equals(x, y)) .map((g) => new Grouping(g.Key, Enumerable.AsEnumerable(g.List))) ) }