tracker.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.Tracker = void 0;
  4. const system_1 = require("./system");
  5. class Tracker {
  6. constructor(spread, effect) {
  7. this.spread = spread;
  8. this.effect = effect;
  9. this.dirtyLevel = 3 /* DirtyLevels.Dirty */;
  10. this.trackId = 0;
  11. this.runnings = 0;
  12. this.queryings = 0;
  13. this.depsLength = 0;
  14. }
  15. get dirty() {
  16. if (this.dirtyLevel === 1 /* DirtyLevels.ComputedValueMaybeDirty */) {
  17. this.dirtyLevel = 0 /* DirtyLevels.NotDirty */;
  18. if (this.trackToken) {
  19. const deps = system_1.depsMap.get(this.trackToken);
  20. if (deps) {
  21. this.queryings++;
  22. (0, system_1.pauseTracking)();
  23. for (const dep of deps) {
  24. if (dep.computed) {
  25. dep.computed();
  26. if (this.dirtyLevel >= 2 /* DirtyLevels.ComputedValueDirty */) {
  27. break;
  28. }
  29. }
  30. }
  31. (0, system_1.resetTracking)();
  32. this.queryings--;
  33. }
  34. }
  35. }
  36. return this.dirtyLevel >= 2 /* DirtyLevels.ComputedValueDirty */;
  37. }
  38. track(fn) {
  39. try {
  40. system_1.activeTrackers.push(this);
  41. this.runnings++;
  42. preCleanup(this);
  43. return fn();
  44. }
  45. finally {
  46. postCleanup(this);
  47. this.runnings--;
  48. system_1.activeTrackers.pop();
  49. if (!this.runnings) {
  50. this.dirtyLevel = 0 /* DirtyLevels.NotDirty */;
  51. }
  52. }
  53. }
  54. reset() {
  55. preCleanup(this);
  56. postCleanup(this);
  57. this.dirtyLevel = 3 /* DirtyLevels.Dirty */;
  58. }
  59. deref() {
  60. return this;
  61. }
  62. }
  63. exports.Tracker = Tracker;
  64. function preCleanup(tracker) {
  65. tracker.trackId++;
  66. tracker.depsLength = 0;
  67. }
  68. function postCleanup(tracker) {
  69. if (tracker.trackToken) {
  70. const deps = system_1.depsMap.get(tracker.trackToken);
  71. if (deps && deps.length > tracker.depsLength) {
  72. for (let i = tracker.depsLength; i < deps.length; i++) {
  73. (0, system_1.cleanupDepEffect)(deps[i], tracker);
  74. }
  75. deps.length = tracker.depsLength;
  76. }
  77. }
  78. }