101 lines
3.3 KiB
JavaScript
101 lines
3.3 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.trigger = exports.cleanupDepEffect = exports.track = exports.depsMap = exports.resetEffect = exports.pauseEffect = exports.resetTracking = exports.pauseTracking = exports.activeTrackers = void 0;
|
||
|
exports.activeTrackers = [];
|
||
|
let pauseEffectStack = 0;
|
||
|
const pausedTrackers = [];
|
||
|
const pausedEffects = [];
|
||
|
function pauseTracking() {
|
||
|
pausedTrackers.push(exports.activeTrackers);
|
||
|
exports.activeTrackers = [];
|
||
|
}
|
||
|
exports.pauseTracking = pauseTracking;
|
||
|
function resetTracking() {
|
||
|
exports.activeTrackers = pausedTrackers.pop();
|
||
|
}
|
||
|
exports.resetTracking = resetTracking;
|
||
|
function pauseEffect() {
|
||
|
pauseEffectStack++;
|
||
|
}
|
||
|
exports.pauseEffect = pauseEffect;
|
||
|
function resetEffect() {
|
||
|
pauseEffectStack--;
|
||
|
while (!pauseEffectStack && pausedEffects.length) {
|
||
|
pausedEffects.shift().effect();
|
||
|
}
|
||
|
}
|
||
|
exports.resetEffect = resetEffect;
|
||
|
exports.depsMap = new WeakMap();
|
||
|
const trackerRegistry = new FinalizationRegistry(trackToken => {
|
||
|
const deps = exports.depsMap.get(trackToken);
|
||
|
if (deps) {
|
||
|
for (const dep of deps) {
|
||
|
dep.delete(trackToken);
|
||
|
}
|
||
|
deps.length = 0;
|
||
|
}
|
||
|
});
|
||
|
function track(dep) {
|
||
|
if (exports.activeTrackers.length) {
|
||
|
const tracker = exports.activeTrackers[exports.activeTrackers.length - 1];
|
||
|
if (!tracker.trackToken) {
|
||
|
if (tracker.effect) {
|
||
|
tracker.trackToken = tracker;
|
||
|
}
|
||
|
else {
|
||
|
tracker.trackToken = new WeakRef(tracker);
|
||
|
trackerRegistry.register(tracker, tracker.trackToken, tracker);
|
||
|
}
|
||
|
exports.depsMap.set(tracker.trackToken, []);
|
||
|
}
|
||
|
const trackToken = tracker.trackToken;
|
||
|
const deps = exports.depsMap.get(trackToken);
|
||
|
if (deps) {
|
||
|
if (dep.get(tracker) !== tracker.trackId) {
|
||
|
dep.set(tracker, tracker.trackId);
|
||
|
const oldDep = deps[tracker.depsLength];
|
||
|
if (oldDep !== dep) {
|
||
|
if (oldDep) {
|
||
|
cleanupDepEffect(oldDep, tracker);
|
||
|
}
|
||
|
deps[tracker.depsLength++] = dep;
|
||
|
}
|
||
|
else {
|
||
|
tracker.depsLength++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
exports.track = track;
|
||
|
function cleanupDepEffect(dep, tracker) {
|
||
|
const trackId = dep.get(tracker);
|
||
|
if (trackId !== undefined && tracker.trackId !== trackId) {
|
||
|
dep.delete(tracker);
|
||
|
}
|
||
|
}
|
||
|
exports.cleanupDepEffect = cleanupDepEffect;
|
||
|
function trigger(dep, dirtyLevel) {
|
||
|
pauseEffect();
|
||
|
for (const trackToken of dep.keys()) {
|
||
|
const tracker = trackToken.deref();
|
||
|
if (!tracker) {
|
||
|
continue;
|
||
|
}
|
||
|
if (tracker.dirtyLevel < dirtyLevel &&
|
||
|
(!tracker.runnings || dirtyLevel !== 2 /* DirtyLevels.ComputedValueDirty */)) {
|
||
|
const lastDirtyLevel = tracker.dirtyLevel;
|
||
|
tracker.dirtyLevel = dirtyLevel;
|
||
|
if (lastDirtyLevel === 0 /* DirtyLevels.NotDirty */ &&
|
||
|
(!tracker.queryings || dirtyLevel !== 2 /* DirtyLevels.ComputedValueDirty */)) {
|
||
|
tracker.spread();
|
||
|
if (tracker.effect) {
|
||
|
pausedEffects.push(tracker);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
resetEffect();
|
||
|
}
|
||
|
exports.trigger = trigger;
|