44 lines
945 B
JavaScript
44 lines
945 B
JavaScript
export function bundle(observables) {
|
|
const activeSubscribers = new Set();
|
|
let activeUpdate = false;
|
|
|
|
const accessor = function _bundle(values) {
|
|
const result = {};
|
|
activeUpdate = true;
|
|
Object.keys(values)
|
|
.filter(k => typeof observables[k] === 'function')
|
|
.forEach(k => {
|
|
result[k] = observables[k](values[k]);
|
|
});
|
|
|
|
const subscribers = Array.from(activeSubscribers);
|
|
// Set them dirty but don't propagate.
|
|
subscribers.forEach(s => s(result, true));
|
|
// Now propagate.
|
|
subscribers.forEach(s => s(result));
|
|
activeSubscribers.clear();
|
|
activeUpdate = false;
|
|
return result;
|
|
};
|
|
|
|
const subscriptionFactory = obsFn => fn => {
|
|
return obsFn(v => {
|
|
if (activeUpdate) {
|
|
activeSubscribers.add(fn);
|
|
} else {
|
|
fn(v);
|
|
}
|
|
return v;
|
|
});
|
|
};
|
|
|
|
Object.keys(observables).forEach(k => {
|
|
const obs = observables[k];
|
|
|
|
accessor[k] = obs;
|
|
obs._d = subscriptionFactory(obs._d);
|
|
});
|
|
|
|
return accessor;
|
|
}
|