import { Modes } from './../modes'; export class Store { constructor() { this.store = {}; this.nextStore = null; this.mode = Modes.RUN; } extendStore (nextStore) { this.nextStore = nextStore; } applyStore (id) { if(!this.store[id]) { if (this.nextStore !== null) { return this.nextStore.applyStore(id); } else { // TODO: better error message throw new Error(`Variable ${id} not found.`); } } const val = this.store[id]; if (val.isRef) { return val.getRefObj(); } return this.store[id]; } updateStore (id, stoObj) { if(!this.store[id]) { if(this.extendStore !== null) { return this.extendStore.updateStore(id, stoObj); } else { // TODO: better error message throw new Error(`Variable ${id} not found.`); } } else { const oldObj = this.store[id]; if(oldObj.readOnly) { // TODO: better error message throw new Error("Cannot change value of a read only variable: " + id); } if(oldObj.isCompatible(stoObj)) { if(oldObj.isRef) { oldObj.updateRef(stoObj); return this; } stoObj.setID(id); this.store[id] = Object.freeze(stoObj); return this; } else { // TODO: better error message throw new Error(`${oldObj.type} is not compatible with the value given`); } } } insertStore (id, stoObj) { if (this.store[id]) { // TODO: better error message throw new Error(`${id} is already defined`); } stoObj.setID(id); this.store[id] = Object.freeze(stoObj); return this; } }