playcanvas
Version:
PlayCanvas WebGL game engine
88 lines (86 loc) • 2.48 kB
JavaScript
/**
* A ordered list-type data structure that can provide item look up by key and can also return a list.
*
* @ignore
*/ class IndexedList {
/**
* Add a new item into the list with a index key.
*
* @param {string} key - Key used to look up item in index.
* @param {object} item - Item to be stored.
*/ push(key, item) {
if (this._index[key]) {
throw Error("Key already in index " + key);
}
var location = this._list.push(item) - 1;
this._index[key] = location;
}
/**
* Test whether a key has been added to the index.
*
* @param {string} key - The key to test.
* @returns {boolean} Returns true if key is in the index, false if not.
*/ has(key) {
return this._index[key] !== undefined;
}
/**
* Return the item indexed by a key.
*
* @param {string} key - The key of the item to retrieve.
* @returns {object|null} The item stored at key. Returns null if key is not in the index.
*/ get(key) {
var location = this._index[key];
if (location !== undefined) {
return this._list[location];
}
return null;
}
/**
* Remove the item indexed by key from the list.
*
* @param {string} key - The key at which to remove the item.
* @returns {boolean} Returns true if the key exists and an item was removed, returns false if
* no item was removed.
*/ remove(key) {
var location = this._index[key];
if (location !== undefined) {
this._list.splice(location, 1);
delete this._index[key];
// update index
for(key in this._index){
var idx = this._index[key];
if (idx > location) {
this._index[key] = idx - 1;
}
}
return true;
}
return false;
}
/**
* Returns the list of items.
*
* @returns {object[]} The list of items.
*/ list() {
return this._list;
}
/**
* Remove all items from the list.
*/ clear() {
this._list.length = 0;
for(var prop in this._index){
delete this._index[prop];
}
}
constructor(){
/**
* @type {object[]}
* @private
*/ this._list = [];
/**
* @type {Object<string, number>}
* @private
*/ this._index = {};
}
}
export { IndexedList };