eagerEffects = {
let EffectQueue = [];
let stabilizationQueued = false;
function stabilize() {
for (const effect of EffectQueue) {
effect.fn(...effect.latestValues)
}
EffectQueue.length = 0;
}
function deferredStabilize() {
if (!stabilizationQueued) {
stabilizationQueued = true;
queueMicrotask(() => {
stabilizationQueued = false;
stabilize();
});
}
}
function combineLatestEffectEager(...inputs) {
const observables = inputs.slice(0, -1);
const fn = inputs[inputs.length - 1];
let latestValues = observables.map(obs => obs.read());
const effect = { fn, latestValues };
EffectQueue.push(effect);
deferredStabilize();
observables.forEach((observable, index) => {
observable.subscribe((value) => {
latestValues[index] = value;
if (!EffectQueue.includes(effect)) {
EffectQueue.push(effect);
deferredStabilize();
}
});
});
}
return {
EffectQueue,
stabilizationQueued,
stabilize,
deferredStabilize,
combineLatestEffectEager
}
}