utils/node_modules/computeds/out/system.js
2024-02-07 01:33:07 -05:00

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;