export class NestedMap { data: Map> = new Map(); get(k1: K1): Map | undefined; get(k1: K1, k2: K2): T | undefined; get(k1: K1, k2?: K2): Map | T | undefined { if (k2 === undefined) { return this.data.get(k1); } return this.data.get(k1)?.get(k2); } set(k1: K1, k2: K2, value: T): void { if (!this.data.has(k1)) { this.data.set(k1, new Map()); } this.data.get(k1)!.set(k2, value); } delete(k1: K1, k2: K2): boolean { return this.data.get(k1)?.delete(k2) ?? false; } has(k1: K1): boolean; has(k1: K1, k2: K2): boolean; has(k1: K1, k2?: K2): boolean { if (k2 === undefined) { return this.data.has(k1); } return this.data.get(k1)?.has(k2) ?? false; } keys(): IterableIterator { return this.data.keys(); } values(): IterableIterator> { return this.data.values(); } entries(): IterableIterator<[K1, Map]> { return this.data.entries(); } [Symbol.iterator](): IterableIterator<[K1, Map]> { return this.entries(); } }