export class MapG extends Map { static require(map: Map, key: K) { const value = map.get(key) if (value === undefined) throw new Error(`required key not found: "${key}"`) return value } static guarantee(map: Map, key: K, make: () => V) { let value = map.get(key) if (value === undefined) { value = make() map.set(key, value) } return value } array() { return [...this] } require(key: K) { return MapG.require(this, key) } guarantee(key: K, make: () => V) { return MapG.guarantee(this, key, make) } } export type Identifiable = {id: Id} export class Pool extends MapG { got(value: V) { return this.has(value.id) } add(value: V) { this.set(value.id, value) return value } remove(value: V) { return this.delete(value.id) } } /** @deprecated renamed to `MapG`, to avoid confusion with vectors like Vec2 */ export const Map2 = MapG