type ReduceFunc = (aggregator: R, item: T) => R export class NaiveArrayList { array: T[] constructor(array?: T[]) { this.array = array || []; } insert(at: number, item: T): NaiveArrayList { const clone = this.array.slice(0); clone.splice(at, 0, item); return new NaiveArrayList(clone); } get?(at: number): T { return this.array[at]; } size(): number { return this.array.length; } reduce(fn: ReduceFunc, aggregator: R): R { return this.array.reduce(fn, aggregator); } }