import { Dictionary } from './dictionary' import { Enumerable, IEnumerable } from './enumerable' import { IEqualityComparer } from './equality-comparer' import { InvalidOperationException } from './exceptions' import { IGrouping } from './grouping' import { IList, List } from './list' import { throws } from './utils' import { I18n } from './i18n' export interface IReadOnlyCollection extends IEnumerable {} export class ReadOnlyCollection implements IReadOnlyCollection, IList { private list: IList public constructor(list: IList) { throws.ThrowIfNull('list', list) this.list = list } public get Length(): number { return this.list.Length } public get IsReadOnly(): boolean { return true } public Set(index: number, item: T): void { throw new InvalidOperationException(I18n.t('errors.readonly.write')) } public Get(index: number): T { return this.list.Get(index) } public Add(item: T): void { throw new InvalidOperationException(I18n.t('errors.readonly.write')) } public Clear(): void { throw new InvalidOperationException(I18n.t('errors.readonly.clear')) } public CopyTo(array: T[], arrayIndex: number): void { this.list.CopyTo(array, arrayIndex) } public IndexOf(item: T): number { return this.list.IndexOf(item) } public Insert(index: number, item: T): void { throw new InvalidOperationException(I18n.t('errors.readonly.write')) } public Remove(item: T): boolean { throw new InvalidOperationException(I18n.t('errors.readonly.remove')) } public RemoveAt(index: number): void { throw new InvalidOperationException(I18n.t('errors.readonly.remove')) } public [Symbol.iterator](): IterableIterator { return this.list[Symbol.iterator]() } public All(predicate: (item: T) => boolean): boolean { return Enumerable.All(this, predicate) } public Any(predicate?: (item: T) => boolean): boolean { return Enumerable.Any(this, predicate) } public AsEnumerable(): IEnumerable { return Enumerable.AsEnumerable(this) } public Average(selector?: (item: T) => number): number | null { return Enumerable.Average(this, selector) } public Concat(second: IEnumerable): IEnumerable { return Enumerable.Concat(this, second) } public Contains(value: T, comparer?: IEqualityComparer): boolean { return Enumerable.Contains(this, value, comparer) } public Count(predicate?: (item: T) => 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): T { return Enumerable.ElementAt(this, index) } public ElementAtOrDefault(defaultValue: T, index: number): T { return Enumerable.ElementAtOrDefault(this, defaultValue, index) } public Except(second: IEnumerable, comparer?: IEqualityComparer): IEnumerable { return Enumerable.Except(this, second, comparer) } public First(predicate?: (item: T) => boolean): T { return Enumerable.First(this, predicate) } public FirstOrDefault(defaultValue: T, predicate?: (item: T) => boolean): T { return Enumerable.FirstOrDefault(this, defaultValue, predicate) } public GroupBy( keySelector: (item: T) => TKey, elementSelector?: (item: T) => TElement, comparer?: IEqualityComparer ): IEnumerable> { return Enumerable.GroupBy(this, keySelector, elementSelector, comparer) } public GroupJoin }>( inner: IEnumerable, outerKeySelector: (item: T) => TKey, innerKeySelector: (item: TInner) => TKey, resultSelector?: (item: T, 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: T) => TKey, innerKeySelector: (item: TInner) => TKey, resultSelector?: (item: T, inners: TInner) => TResult, comparer?: IEqualityComparer ): IEnumerable { return Enumerable.Join(this, inner, outerKeySelector, innerKeySelector, resultSelector, comparer) } public Last(predicate?: (item: T) => boolean): T { return Enumerable.Last(this, predicate) } public LastOrDefault(defaultValue: T, predicate?: (item: T) => boolean): T { return Enumerable.LastOrDefault(this, defaultValue, predicate) } public Max(selector?: (item: T) => number): number | null { return Enumerable.Max(this, selector) } public Min(selector?: (item: T) => number): number | null { return Enumerable.Min(this, selector) } public Reverse(): IEnumerable { return Enumerable.Reverse(this) } public Select(selector: (item: T, index?: number) => TResult): IEnumerable { return Enumerable.Select(this, selector) } public SelectMany( collectionSelector: (item: T, index?: number) => IEnumerable, resultSelector?: (item: T, 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: T) => boolean): T { return Enumerable.Single(this, predicate) } public SingleOrDefault(defaultValue: T, predicate?: (item: T) => boolean): T { return Enumerable.SingleOrDefault(this, defaultValue, predicate) } public Skip(count: number): IEnumerable { return Enumerable.Skip(this, count) } public SkipWhile(predicate: (item: T, index?: number) => boolean): IEnumerable { return Enumerable.SkipWhile(this, predicate) } public Sum(selector?: (item: T) => number): number | null { return Enumerable.Sum(this, selector) } public Take(count: number): IEnumerable { return Enumerable.Take(this, count) } public TakeWhile(predicate: (item: T, index?: number) => boolean): IEnumerable { return Enumerable.TakeWhile(this, predicate) } public ToArray(): Array { return Enumerable.ToArray(this) } public ToDictionary( keySelector: (item: T) => TKey, elementSelector?: (item: T) => TElement, 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: T, index?: number) => boolean): IEnumerable { return Enumerable.Where(this, predicate) } }