@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
52 lines • 3.41 kB
JavaScript
/**
* 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) {
var _a;
const { map, count } = this;
if (count.has(key)) {
count.set(key, 1 + ((_a = count.get(key)) !== null && _a !== void 0 ? _a : 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) {
var _a;
const { map, count } = this;
if (!map.has(key))
return;
const newCount = ((_a = count.get(key)) !== null && _a !== void 0 ? _a : 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlLW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWZlcmVuY2UtbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBWTtJQUFqQztRQUNxQixRQUFHLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUE7UUFDbkMsVUFBSyxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFBO0lBMkN2RCxDQUFDO0lBekNHOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsR0FBWSxFQUFFLE9BQXdCOztRQUN0QyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQTtRQUMzQixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLG1DQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDekMsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNqQyxJQUFJLENBQUMsWUFBWTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUE7WUFDekUsT0FBTyxZQUFZLENBQUE7UUFDdkIsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE9BQU8sRUFBRSxDQUFBO1FBQzFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2pCLE9BQU8sUUFBUSxDQUFBO0lBQ25CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxHQUFZOztRQUNmLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU07UUFFekIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxNQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLG1DQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMxQyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNmLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ3hCLE9BQU07UUFDVixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMxQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2YsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNqQixPQUFPLEtBQUssQ0FBQTtJQUNoQixDQUFDO0NBQ0oifQ==