avocado-old/packages/state/synchronizer.js
2019-04-23 15:25:03 -05:00

59 lines
1.2 KiB
JavaScript

import * as I from 'immutable';
import {nextStep} from './next-step';
export class Synchronizer {
constructor(statefuls) {
this._state = I.Map();
this._statefuls = statefuls;
this.updateState();
}
patchState(patch) {
const stepMap = {};
for (const step of patch) {
const [key, substep] = nextStep(step)
if (!stepMap[key]) {
stepMap[key] = [];
}
stepMap[key].push(substep);
}
for (const key in stepMap) {
const stateful = this._statefuls[key];
if (!stateful) {
continue;
}
stateful.patchState(stepMap[key]);
}
}
setStateful(key, stateful) {
this._statefuls[key] = stateful;
}
get state() {
return this._state;
}
tick(elapsed) {
for (const key in this._statefuls) {
const stateful = this._statefuls[key];
stateful.tick(elapsed);
}
this.updateState();
}
updateState() {
if (AVOCADO_SERVER) {
this._state = this._state.withMutations((state) => {
for (const key in this._statefuls) {
const stateful = this._statefuls[key];
state.set(key, stateful.state);
}
});
}
}
}