UNPKG

motion-dom

Version:
50 lines (47 loc) • 1.68 kB
import { frame, cancelFrame } from '../frameloop/frame.mjs'; import { numberValueTypes } from '../value/types/maps/number.mjs'; import { getValueAsType } from '../value/types/utils/get-as-type.mjs'; class MotionValueState { /** * @param step - The frameloop step renders are scheduled in. Defaults * to `frame.render`. Effects that feed a render loop running in * `frame.render` (GPU scenes) should write in `frame.preRender`. */ constructor(step = frame.render) { this.step = step; this.latest = {}; this.values = new Map(); } set(name, value, render, computed, useDefaultValueType = true) { const existingValue = this.values.get(name); if (existingValue) { existingValue.onRemove(); } const onChange = () => { const v = value.get(); if (useDefaultValueType) { this.latest[name] = getValueAsType(v, numberValueTypes[name]); } else { this.latest[name] = v; } render && this.step(render); }; onChange(); const cancelOnChange = value.on("change", onChange); computed && value.addDependent(computed); const remove = () => { cancelOnChange(); render && cancelFrame(render); this.values.delete(name); computed && value.removeDependent(computed); }; this.values.set(name, { value, onRemove: remove }); return remove; } get(name) { return this.values.get(name)?.value; } } export { MotionValueState }; //# sourceMappingURL=MotionValueState.mjs.map