79 lines
2.4 KiB
JavaScript
79 lines
2.4 KiB
JavaScript
|
"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;
|
||
|
}
|
||
|
}
|
||
|
}
|