UNPKG

fluids

Version:

Glue layer for reactivity

90 lines 2.74 kB
var $get = Symbol.for('FluidValue.get'); var $observers = Symbol.for('FluidValue.observers'); export { FluidValue, hasFluidValue, getFluidValue, getFluidObservers, callFluidObserver, callFluidObservers, // Mutations setFluidGetter, addFluidObserver, removeFluidObserver, }; /** Returns true if `arg` can be observed. */ var hasFluidValue = function (arg) { return Boolean(arg && arg[$get]); }; /** * Get the current value. * If `arg` is not observable, `arg` is returned. */ var getFluidValue = function (arg) { return arg && arg[$get] ? arg[$get]() : arg; }; /** Get the current observer set. Never mutate it directly! */ var getFluidObservers = function (target) { return target[$observers] || null; }; function callFluidObserver(observer, event) { if (observer.eventObserved) { observer.eventObserved(event); } else { observer(event); } } function callFluidObservers(target, event) { var observers = target[$observers]; if (observers) { observers.forEach(function (observer) { callFluidObserver(observer, event); }); } } /** * `FluidValue` objects can be unwrapped with `getFluidValue` to access * their current value. * * Libraries may support observable values by handling `FluidValue` objects * in their functions and classes. */ var FluidValue = /** @class */ (function () { function FluidValue(get) { if (!get && !(get = this.get)) { throw Error('Unknown getter'); } setFluidGetter(this, get); } return FluidValue; }()); /** Define the getter called by `getFluidValue`. */ var setFluidGetter = function (target, get) { return setHidden(target, $get, get); }; function addFluidObserver(target, observer) { var observers = target[$observers]; if (!observers) { setHidden(target, $observers, (observers = new Set())); } if (!observers.has(observer)) { observers.add(observer); if (target.observerAdded) { target.observerAdded(observers.size, observer); } } return observer; } function removeFluidObserver(target, observer) { var observers = target[$observers]; if (observers && observers.has(observer)) { var count = observers.size - 1; if (count) { observers.delete(observer); } else { setHidden(target, $observers, null); } if (target.observerRemoved) { target.observerRemoved(count, observer); } } } var setHidden = function (target, key, value) { return Object.defineProperty(target, key, { value: value, writable: true, configurable: true, }); }; //# sourceMappingURL=fluids.js.map