let storageNames = [
'selectronTube',
'floppyDisk',
'zipDrive',
'DVD',
'sdCard',
'flashDrive',
'SSD',
'ssdArray',
'serverRack',
'serverRoom',
'dataCenter',
'multipleCenters',
'smallAfricanCountry',
'multipleCountries',
'alienSpaceArray',
'enslavedHumans'
];
/** Class representing a storage object.
* @typeicalname storageObj
* @class
*/
class Storage {
/**
* Instantiate a Storage object
* @constructor
* @param {string} name - Name of storage object.
* @param {number} idx - Index in list of StorageContainer's storage objects.
* @param {string | undefined} prev - Name of Storage object preceding this object in list of StorageContainer's storage objects.
*/
constructor(name, idx, prev) {
/** @prop {string} name - Name of storage object */
this.name = name;
/** @prop {number} idx - Index in list of StorageContainer's storage objects. */
this.idx = idx;
/** @prop {number} capacity - Capacity of storage object */
this.capacity = Math.pow(1024, idx+1);
/** @prop {number} price - Price of storage object */
this.price = Math.pow(1024, idx) - 1;
/** @prop {string | undefined} prev - Name of Storage object preceding this object in list of StorageContainer's storage objects. */
this.prev = prev;
}
}
let instance = null;
/** Class representing a container for all Storage instances, as well as a representation of the current Storage instance.
* @typeicalname storage
* @class
*/
class StorageContainer {
constructor(storages) {
var _storages = {};
var _storageArr = [];
for (let i = 0; i < storages.length; i++) {
let name = storages[i];
let prev = null;
if (i > 0) {
prev = storages[i-1];
}
let storage = new Storage(name, i, prev);
_storageArr.push(storage);
_storages[name] = storage;
}
this._storages = _storages;
this._storageNames = storages;
_storageArr.sort((a, b) => a.idx - b.idx);
this._storageArr = _storageArr;
this._current = _storages[storages[0]];
}
/**
* Name of current storage.
* @type {string}
*/
get name() {
return this._current.name;
}
/**
* Capacity of current storage.
* @type {number}
*/
get capacity() {
return this._current.capacity;
}
/**
* Price of current storage.
* @type {number}
*/
get price() {
return this._current.price;
}
/**
* ID of current storage.
* @type {number}
*/
get idx() {
return this._current.idx;
}
/**
* Current storage.
* @type {Storage}
*/
get current() {
return this._current;
}
set current(val) {
console.log("Type of val:", val);
console.log("Val:", val);
if (typeof val === "string") {
this._current = this._storages[val];
} else if (typeof val === "object" && 'name' in val && val.name in this._storages) {
this._current = this._storages[val.name];
} else {
console.error("Invalid parameter type.");
}
}
/**
* Next storage in upgrade list.
* @type {Storage}
*/
get upgrade() {
return this._storageArr.find((e) => e.prev === this._current.name);
}
/**
* Check if storage is full.
* @param {number} data - Data to check against.
* @param {number} increment - Increment to check against.
* @return {boolean} If storage has enough space.
*/
checkStorage(data, increment) {
return ((data + increment) <= this._current.capacity);
}
/**
* Names of all storages excluding the currently selected.
* @type {string[]}
*/
get otherNames() {
var storNames = this._storageNames.slice();
storNames.splice(this._current.idx, 1);
return storNames;
}
/**
* All storages excluding the currently selected.
* @type {Object}
*/
get others() {
return this.otherNames.reduce((o, v) => {
o[v] = this._storages[v];
return o;
}, {});
}
/**
* Names of all storages.
* @type {string[]}
*/
get allNames() {
return this._storageNames;
}
/**
* All storages.
* @type {Object}
*/
get all() {
return this._storages;
}
}
/**
* Instantiate StorageContainer
* @memberof StorageContainer
* @param {string[] | undefined} storages - Names of storages. If undefined, use default storages.
* @return {StorageContainer}
*/
function getStorage(storages = storageNames) {
if (!instance) {
instance = new StorageContainer(storages);
}
return instance;
}
export { getStorage, Storage };