import * as plugins from './classes.plugins.js';

export class LimitedArray<T> {
  array: T[] = [];
  arrayLimit: number;
  constructor(limitArg: number) {
    this.arrayLimit = limitArg;
  }

  public get length(): number {
    return this.array.length;
  }

  addOne(objectArg: T) {
    this.array.unshift(objectArg);
    if (this.array.length > this.arrayLimit) {
      this.array.length = this.arrayLimit;
    }
  }

  addMany(objectArrayArg: T[]) {
    for (let objectArg of objectArrayArg) {
      this.addOne(objectArg);
    }
  }

  setLimit(limitArg: number) {
    this.arrayLimit = limitArg;
    if (this.array.length > this.arrayLimit) {
      this.array.length = this.arrayLimit;
    }
  }

  getAverage(): number {
    if (this.array.length === 0) {
      return 0;
    }
    if (typeof this.array[0] === 'number') {
      let sum = 0;
      for (let localNumber of this.array) {
        let localNumberAny: any = localNumber;
        sum = sum + localNumberAny;
      }
      return sum / this.array.length;
    } else {
      return null;
    }
  }

  remove(item: T): boolean {
    const idx = this.array.indexOf(item);
    if (idx !== -1) {
      this.array.splice(idx, 1);
      return true;
    }
    return false;
  }

  clear(): void {
    this.array.length = 0;
  }

  getArray(): T[] {
    return [...this.array];
  }

  public [Symbol.iterator](): Iterator<T> {
    return this.array[Symbol.iterator]();
  }
}
