portfolio/packages/frptools/src/observable.js

21 lines
437 B
JavaScript

export function observable(store) {
const subscribers = new Set();
const accessor = function _observable(newVal) {
if (newVal !== undefined && store !== newVal) {
store = newVal;
subscribers.forEach(s => s(store));
}
return store;
};
accessor.subscribe = accessor._d = fn => {
subscribers.add(fn);
return () => subscribers.delete(fn);
};
accessor.unsubscribeAll = () => subscribers.clear();
return accessor;
}