import { OrderedMap } from 'immutable'; export class SparseArray { private tree: OrderedMap; private constructor(tree?: OrderedMap) { this.tree = tree || OrderedMap(); } static create() { return new SparseArray(); } get(index: number): T | null { return this.tree.has(index) ? this.tree.get(index)! : null; } set(index: number, item: T): SparseArray { const newTree = this.tree.set(index, item); return new SparseArray(newTree); } slice(start: number, end: number): (T | null)[] { const result: (T | null)[] = []; for (let i = start; i < end; i++) { result.push(this.get(i)); } return result; } putIn(start: number, items: T[]): SparseArray { let newTree = this.tree; for (let i = 0; i < items.length; i++) { newTree = newTree.set(start + i, items[i]); } return new SparseArray(newTree); } }