UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

50 lines 3.28 kB
/** * A Reference Map counts how many time you want to insert the same key. * And it tells you when you delete it as many times. */ export default class ReferenceMap { constructor() { this.map = new Map(); this.count = new Map(); } /** * If `key` is already stored in the map, * we add a reference to the mapped value and return it. * If not, we create the mapped value by calling `factory()`. */ add(key, factory) { const { map, count } = this; if (count.has(key)) { count.set(key, 1 + (count.get(key) ?? 0)); const currentValue = map.get(key); if (!currentValue) throw new Error("[CountMap] Map should not be empty!"); return currentValue; } const newValue = factory(); map.set(key, newValue); count.set(key, 1); return newValue; } /** * Delete a reference to `key`. * If the last reference has been removed, * then return the mapped value, otherwise * return `undefined`. */ delete(key) { const { map, count } = this; if (!map.has(key)) return; const newCount = (count.get(key) ?? 0) - 1; if (newCount > 0) { count.set(key, newCount); return; } const value = map.get(key); map.delete(key); count.delete(key); return value; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlLW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWZlcmVuY2UtbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBWTtJQUFqQztRQUNxQixRQUFHLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUE7UUFDbkMsVUFBSyxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFBO0lBMkN2RCxDQUFDO0lBekNHOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsR0FBWSxFQUFFLE9BQXdCO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQzNCLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN6QyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2pDLElBQUksQ0FBQyxZQUFZO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtZQUN6RSxPQUFPLFlBQVksQ0FBQTtRQUN2QixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxFQUFFLENBQUE7UUFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDdEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDakIsT0FBTyxRQUFRLENBQUE7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLEdBQVk7UUFDZixNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQTtRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFNO1FBRXpCLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDMUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDZixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUN4QixPQUFNO1FBQ1YsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDMUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNmLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDakIsT0FBTyxLQUFLLENBQUE7SUFDaEIsQ0FBQztDQUNKIn0=