123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.Tracker = void 0;
- const system_1 = require("./system");
- class Tracker {
- constructor(spread, effect) {
- this.spread = spread;
- this.effect = effect;
- this.dirtyLevel = 3 /* DirtyLevels.Dirty */;
- this.trackId = 0;
- this.runnings = 0;
- this.queryings = 0;
- this.depsLength = 0;
- }
- get dirty() {
- if (this.dirtyLevel === 1 /* DirtyLevels.ComputedValueMaybeDirty */) {
- this.dirtyLevel = 0 /* DirtyLevels.NotDirty */;
- if (this.trackToken) {
- const deps = system_1.depsMap.get(this.trackToken);
- if (deps) {
- this.queryings++;
- (0, system_1.pauseTracking)();
- for (const dep of deps) {
- if (dep.computed) {
- dep.computed();
- if (this.dirtyLevel >= 2 /* DirtyLevels.ComputedValueDirty */) {
- break;
- }
- }
- }
- (0, system_1.resetTracking)();
- this.queryings--;
- }
- }
- }
- return this.dirtyLevel >= 2 /* DirtyLevels.ComputedValueDirty */;
- }
- track(fn) {
- try {
- system_1.activeTrackers.push(this);
- this.runnings++;
- preCleanup(this);
- return fn();
- }
- finally {
- postCleanup(this);
- this.runnings--;
- system_1.activeTrackers.pop();
- if (!this.runnings) {
- this.dirtyLevel = 0 /* DirtyLevels.NotDirty */;
- }
- }
- }
- reset() {
- preCleanup(this);
- postCleanup(this);
- this.dirtyLevel = 3 /* DirtyLevels.Dirty */;
- }
- deref() {
- return this;
- }
- }
- exports.Tracker = Tracker;
- function preCleanup(tracker) {
- tracker.trackId++;
- tracker.depsLength = 0;
- }
- function postCleanup(tracker) {
- if (tracker.trackToken) {
- const deps = system_1.depsMap.get(tracker.trackToken);
- if (deps && deps.length > tracker.depsLength) {
- for (let i = tracker.depsLength; i < deps.length; i++) {
- (0, system_1.cleanupDepEffect)(deps[i], tracker);
- }
- deps.length = tracker.depsLength;
- }
- }
- }
|