import { Dictionary } from './dictionary' import { Enumerable, IEnumerable } from './enumerable' import { IEqualityComparer } from './equality-comparer' import { List } from './list' export interface IGrouping extends IEnumerable { readonly Key: TKey readonly Items: IEnumerable } export class Grouping implements IGrouping { private key: TKey private source: IEnumerable public constructor(key: TKey, source: IEnumerable) { this.key = key this.source = source } public get Key(): TKey { return this.key } public get Items(): IEnumerable { return this.source } public [Symbol.iterator](): IterableIterator { return this.source[Symbol.iterator]() } public All(predicate: (item: TElement) => boolean): boolean { return Enumerable.All(this, predicate) } public Any(predicate?: (item: TElement) => boolean): boolean { return Enumerable.Any(this, predicate) } public AsEnumerable(): IEnumerable { return Enumerable.AsEnumerable(this.source) } public Average(selector?: (item: TElement) => number): number | null { return Enumerable.Average(this, selector) } public Concat(second: IEnumerable): IEnumerable { return Enumerable.Concat(this, second) } public Contains(value: TElement, comparer?: IEqualityComparer): boolean { return Enumerable.Contains(this, value, comparer) } public Count(predicate?: (item: TElement) => boolean): number { return Enumerable.Count(this, predicate) } public DefaultIfEmpty(defaultValue?: IEnumerable): IEnumerable { return Enumerable.DefaultIfEmpty(this, defaultValue) } public Distinct(comparer?: IEqualityComparer): IEnumerable { return Enumerable.Distinct(this, comparer) } public ElementAt(index: number): TElement { return Enumerable.ElementAt(this, index) } public ElementAtOrDefault(defaultValue: TElement, index: number): TElement { return Enumerable.ElementAtOrDefault(this, defaultValue, index) } public Except(second: IEnumerable, comparer?: IEqualityComparer): IEnumerable { return Enumerable.Except(this, second, comparer) } public First(predicate?: (item: TElement) => boolean): TElement { return Enumerable.First(this, predicate) } public FirstOrDefault(defaultValue: TElement, predicate?: (item: TElement) => boolean): TElement { return Enumerable.FirstOrDefault(this, defaultValue, predicate) } public GroupBy( keySelector: (item: TElement) => TKey, elementSelector?: (item: TElement) => TGroupElement, comparer?: IEqualityComparer ): IEnumerable> { return Enumerable.GroupBy(this, keySelector, elementSelector, comparer) } public GroupJoin }>( inner: IEnumerable, outerKeySelector: (item: TElement) => TKey, innerKeySelector: (item: TInner) => TKey, resultSelector?: (item: TElement, inners: IEnumerable) => TResult, comparer?: IEqualityComparer ): IEnumerable { return Enumerable.GroupJoin(this, inner, outerKeySelector, innerKeySelector, resultSelector, comparer) } public Intersect(second: IEnumerable, comparer?: IEqualityComparer): IEnumerable { return Enumerable.Intersect(this, second, comparer) } public Join( inner: IEnumerable, outerKeySelector: (item: TElement) => TKey, innerKeySelector: (item: TInner) => TKey, resultSelector?: (item: TElement, inners: TInner) => TResult, comparer?: IEqualityComparer ): IEnumerable { return Enumerable.Join(this, inner, outerKeySelector, innerKeySelector, resultSelector, comparer) } public Last(predicate?: (item: TElement) => boolean): TElement { return Enumerable.Last(this, predicate) } public LastOrDefault(defaultValue: TElement, predicate?: (item: TElement) => boolean): TElement { return Enumerable.LastOrDefault(this, defaultValue, predicate) } public Max(selector?: (item: TElement) => number): number | null { return Enumerable.Max(this, selector) } public Min(selector?: (item: TElement) => number): number | null { return Enumerable.Min(this, selector) } public Reverse(): IEnumerable { return Enumerable.Reverse(this) } public Select(selector: (item: TElement, index?: number) => TResult): IEnumerable { return Enumerable.Select(this, selector) } public SelectMany( collectionSelector: (item: TElement, index?: number) => IEnumerable, resultSelector?: (item: TElement, collection: TCollection) => TResult ): IEnumerable { return Enumerable.SelectMany(this, collectionSelector, resultSelector) } public SequenceEqual(second: Iterable, comparer?: IEqualityComparer): boolean { return Enumerable.SequenceEqual(this, second, comparer) } public Single(predicate?: (item: TElement) => boolean): TElement { return Enumerable.Single(this, predicate) } public SingleOrDefault(defaultValue: TElement, predicate?: (item: TElement) => boolean): TElement { return Enumerable.SingleOrDefault(this, defaultValue, predicate) } public Skip(count: number): IEnumerable { return Enumerable.Skip(this, count) } public SkipWhile(predicate: (item: TElement, index?: number) => boolean): IEnumerable { return Enumerable.SkipWhile(this, predicate) } public Sum(selector?: (item: TElement) => number): number | null { return Enumerable.Sum(this, selector) } public Take(count: number): IEnumerable { return Enumerable.Take(this, count) } public TakeWhile(predicate: (item: TElement, index?: number) => boolean): IEnumerable { return Enumerable.TakeWhile(this, predicate) } public ToArray(): Array { return Enumerable.ToArray(this) } public ToDictionary( keySelector: (item: TElement) => TKey, elementSelector?: (item: TElement) => TDictionaryElement, comparer?: IEqualityComparer ): Dictionary { return Enumerable.ToDictionary(this, keySelector, elementSelector, comparer) } public ToList(): List { return Enumerable.ToList(this) } public Union(second: Iterable, comparer?: IEqualityComparer): IEnumerable { return Enumerable.Union(this, second, comparer) } public Where(predicate: (item: TElement, index?: number) => boolean): IEnumerable { return Enumerable.Where(this, predicate) } }