{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-livelyenergy/demos/lively-simulation/engine.js"],"names":["_","MAX_VELOCITY","MIN_VELOCITY","MILLISECONDS_PER_SECOND","Engine","constructor","velocity","collectCells","stopOnError","time","timeDeltaPerStepInSeconds","toggleStartStop","isRunning","wasRunning","stop","start","updateSimulationLoop","step","limitExecution","cells","sortedCells","sortBy","prevState","collectState","injectTime","isEmpty","executionCells","executeAllCells","nextState","updateCellStates","state","incrementTime","dt","increaseVelocity","setVelocity","min","decreaseVelocity","max","setTime","setTimeDeltaPerStepInSeconds","forEach","cell","setState","mapValues","getNormalizedName","value","reduce","reject","isMirrorCell","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, time = 0, timeDeltaPerStepInSeconds = 1) {\n    this.collectCells = collectCells;\n    this.velocity = velocity;\n    this.stopOnError = stopOnError;\n    this.time = time;\n    this.timeDeltaPerStepInSeconds = timeDeltaPerStepInSeconds;\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 time = this.injectTime(prevState, _.isEmpty(limitExecution));\n    const executionCells = limitExecution || sortedCells;\n    return this.executeAllCells(executionCells, prevState)\n      .then(nextState => this.updateCellStates(sortedCells, nextState, time))\n      .then(() => this.stepCounter++);\n  }\n  \n  injectTime(state, incrementTime) {\n    const { time, timeDeltaPerStepInSeconds } = this;\n    if (incrementTime)\n      this.time = time + timeDeltaPerStepInSeconds * MILLISECONDS_PER_SECOND;\n    state['simulation'] = { time: this.time, dt: timeDeltaPerStepInSeconds };\n    return this.time;\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  setTime(time) {\n    this.time = time;\n  }\n  \n  setTimeDeltaPerStepInSeconds(dt) {\n    this.timeDeltaPerStepInSeconds = dt;\n  }\n  \n  updateCellStates(cells, state, time) {\n    _.forEach(cells, cell =>\n      cell.setState(_.mapValues(state[cell.getNormalizedName()], (value) => ({ value })), time));\n  }\n\n  collectState(cells) {\n    return _.reduce(\n      _.reject(cells, cell => cell.isMirrorCell()), \n      (partialState, cell) => { \n        partialState[cell.getNormalizedName()] = _.mapValues(cell.getState(), 'value');\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;"]}