avocado-old/packages/state/synchronized.js

64 lines
1.2 KiB
JavaScript
Raw Normal View History

2019-04-07 11:43:50 -05:00
import * as I from 'immutable';
import {compose} from '@avocado/core';
import {Property} from '@avocado/mixins';
2019-04-07 15:46:07 -05:00
import {nextStep} from './next-step';
2019-04-07 11:43:50 -05:00
const decorate = compose(
Property('state'),
);
export class Synchronized extends decorate(class {}) {
constructor() {
super();
this.state = I.Map();
}
synchronizedChildren() {
return [];
}
patchState(patch) {
for (const step of patch) {
const {op, path, value} = step;
if ('/' === path) {
for (const key in value) {
this.patchStateStep(key, {...step, value: value[key]});
}
}
else {
2019-04-07 15:46:07 -05:00
const [key, substep] = nextStep(step);
2019-04-07 11:43:50 -05:00
this.patchStateStep(key, {...substep, value: substep.value});
}
}
}
patchStateStep(key, step) {
if (!(key in this)) {
return;
}
if (this[key] instanceof Synchronized) {
this[key].patchState([step]);
}
else {
this[key] = step.value;
}
}
tick(elapsed) {
for (const key of this.synchronizedChildren()) {
if (this[key] instanceof Synchronized) {
this[key].tick(elapsed);
this.state = this.state.set(key, this[key].state);
}
else {
this.state = this.state.set(key, this[key]);
}
}
}
}