{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-stable/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;"]}