export class TupleMap { mainMap = new Map>() get isEmpty(): boolean { return this.mainMap.size === 0 || this.everyMapIsEmpty() } everyMapIsEmpty(): boolean { for (const b of this.mainMap.values()) { if (b.size) return false } return true } get(a: A, b: B): C { const m = this.mainMap.get(a) if (m) return m.get(b) } has(a: A, b: B): boolean { const m = this.mainMap.get(a) if (!m) return false return m.has(b) } set(a: A, b: B, c: C) { let m = this.mainMap.get(a) if (!m) { m = new Map() this.mainMap.set(a, m) } m.set(b, c) } *[Symbol.iterator](): IterableIterator<[A, B, C]> { for (const [a, m] of this.mainMap) { for (const [b, c] of m) { yield [a, b, c] } } } *keys(): IterableIterator<[A, B]> { for (const [a, m] of this.mainMap) { for (const [b] of m) { yield [a, b] } } } }