{"version":3,"sources":["https://lively-kernel.org/lively4/swt1-debugging/demos/engery-sim/engine.js"],"names":["_","MAX_VELOCITY","MIN_VELOCITY","MILLISECONDS_PER_SECOND","Engine","constructor","velocity","collectCells","stopOnError","toggleStartStop","isRunning","wasRunning","stop","start","updateSimulationLoop","step","limitExecution","cells","sortedCells","sortBy","prevState","collectState","exectionCells","executeAllCells","nextState","updateCellStates","increaseVelocity","setVelocity","min","decreaseVelocity","max","state","forEach","cell","setState","getNormalizedName","reduce","partialState","getState","statePromise","then","execute","resolve"],"mappings":"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","file":"engine.js","sourcesContent":["\"enable aexpr\";\n\nimport _ from 'src/external/lodash/lodash.js';\n\nconst MAX_VELOCITY = 60;\nconst MIN_VELOCITY = 1;\nconst MILLISECONDS_PER_SECOND = 1000;\n\nclass Engine {\n  \n  constructor(velocity = MIN_VELOCITY, collectCells = () => [], stopOnError = false) {\n    this.collectCells = collectCells;\n    this.velocity = velocity;\n    this.stopOnError = stopOnError;\n    this.step = this.step.bind(this);\n  }\n  \n  toggleStartStop() {\n    const { isRunning: wasRunning } = this;\n    if (wasRunning) this.stop();\n    else this.start();\n  }\n  \n  start() {\n    const { isRunning } = this;\n    if (isRunning) return;\n    this.isRunning = true;\n    this.simulationLoop = setInterval(this.step, (MILLISECONDS_PER_SECOND / this.velocity));\n  }\n  \n  stop() {\n    const { isRunning } = this;\n    if (!isRunning) return;\n    this.isRunning = false;\n    clearInterval(this.simulationLoop);\n  }\n  \n  updateSimulationLoop() {\n    const { isRunning } = this;\n    if (!isRunning) return;\n    this.stop();\n    this.start();\n  }\n  \n  step(limitExecution) {\n    const cells = this.collectCells();\n    const sortedCells = _.sortBy(cells, ['offsetTop', 'offsetLeft']);\n    const prevState = this.collectState(sortedCells);\n    const exectionCells = limitExecution || sortedCells;\n    return this.executeAllCells(exectionCells, prevState)\n      .then(nextState => this.updateCellStates(sortedCells, nextState));\n  }\n  \n  increaseVelocity() {\n    const { velocity } = this;\n    this.setVelocity(Math.min(MAX_VELOCITY, velocity + 1));\n  }\n  \n  decreaseVelocity() {\n    const { velocity } = this;\n    this.setVelocity(Math.max(MIN_VELOCITY, velocity - 1));\n  }\n  \n  setVelocity(velocity) {\n    this.velocity = velocity;\n    this.updateSimulationLoop();\n  }\n  \n  updateCellStates(cells, state) {\n    _.forEach(cells, cell =>\n      cell.setState(state[cell.getNormalizedName()]));\n  }\n\n  collectState(cells) {\n    return _.reduce(\n      cells, \n      (partialState, cell) => { \n        partialState[cell.getNormalizedName()] = cell.getState();\n        return partialState;\n      },\n      {}\n    );\n  }\n  \n  executeAllCells(cells, state) {\n    const { stopOnError } = this;\n    return _.reduce(\n      cells, \n      (statePromise, cell) => \n      statePromise\n        .then(state => cell.execute(state))\n        .catch(({ state }) => (!stopOnError || !this.stop()) && state),\n      Promise.resolve(state)\n    );\n  }\n}\n\nexport default Engine;"]}