123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- "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;
|