async-reactivity 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/computed.js +23 -4
- package/lib/computed.test.js +51 -0
- package/lib/effect.js +41 -13
- package/lib/tracker.js +18 -0
- package/package.json +1 -1
- package/src/computed.test.ts +60 -0
- package/src/computed.ts +21 -4
- package/src/effect.ts +45 -14
- package/types/computed.d.ts.map +1 -1
- package/types/effect.d.ts.map +1 -1
- package/types/tracker.d.ts +10 -0
- package/types/tracker.d.ts.map +1 -0
package/lib/computed.js
CHANGED
|
@@ -28,10 +28,29 @@ export default class Computed extends Effect {
|
|
|
28
28
|
if (this.state === EffectState.Initial || this.state === EffectState.Scheduled) {
|
|
29
29
|
const oldValue = this._value;
|
|
30
30
|
const newValue = this.run();
|
|
31
|
-
if (newValue
|
|
32
|
-
this.
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
if (newValue === InSyncSymbol) {
|
|
32
|
+
this.validateDependents();
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
if (newValue instanceof Promise) {
|
|
36
|
+
// @ts-expect-error
|
|
37
|
+
this._value = Promise.all([newValue, oldValue])
|
|
38
|
+
.then(([newValue, oldValue]) => {
|
|
39
|
+
if (newValue === InSyncSymbol) {
|
|
40
|
+
this.validateDependents();
|
|
41
|
+
return oldValue;
|
|
42
|
+
}
|
|
43
|
+
if (this.dependents.size > 0 && this.isEqual(newValue, oldValue)) {
|
|
44
|
+
this.validateDependents();
|
|
45
|
+
}
|
|
46
|
+
return newValue;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this._value = newValue;
|
|
51
|
+
if (this.dependents.size > 0 && this.isEqual(newValue, oldValue)) {
|
|
52
|
+
this.validateDependents();
|
|
53
|
+
}
|
|
35
54
|
}
|
|
36
55
|
}
|
|
37
56
|
}
|
package/lib/computed.test.js
CHANGED
|
@@ -115,6 +115,23 @@ describe('computed', function () {
|
|
|
115
115
|
assert.strictEqual(c.value, 6);
|
|
116
116
|
assert.strictEqual(gate, 1);
|
|
117
117
|
});
|
|
118
|
+
it('ignore in sync dependencies', function () {
|
|
119
|
+
let gate = 0;
|
|
120
|
+
const a = new Ref(5);
|
|
121
|
+
const b = new Computed((value) => {
|
|
122
|
+
return value(a) % 2 + 5;
|
|
123
|
+
});
|
|
124
|
+
const c = new Computed((value) => value(b));
|
|
125
|
+
const d = new Computed((value) => {
|
|
126
|
+
gate++;
|
|
127
|
+
return value(c);
|
|
128
|
+
});
|
|
129
|
+
assert.strictEqual(d.value, 6);
|
|
130
|
+
assert.strictEqual(gate, 1);
|
|
131
|
+
a.value = 7;
|
|
132
|
+
assert.strictEqual(d.value, 6);
|
|
133
|
+
assert.strictEqual(gate, 1);
|
|
134
|
+
});
|
|
118
135
|
it('compute when forced', function () {
|
|
119
136
|
let gate = 0;
|
|
120
137
|
const a = new Ref(5);
|
|
@@ -304,6 +321,40 @@ describe('computed', function () {
|
|
|
304
321
|
assert.strictEqual(await v, 5);
|
|
305
322
|
assert.strictEqual(gate, 1);
|
|
306
323
|
});
|
|
324
|
+
it('ignore same computed values', async function () {
|
|
325
|
+
let gate = 0;
|
|
326
|
+
const a = new Ref(5);
|
|
327
|
+
const b1 = new Computed(async (value) => {
|
|
328
|
+
return value(a) % 2;
|
|
329
|
+
});
|
|
330
|
+
const b2 = new Computed(async () => 5);
|
|
331
|
+
const c = new Computed(async (value) => {
|
|
332
|
+
gate++;
|
|
333
|
+
return await value(b1) + await value(b2);
|
|
334
|
+
});
|
|
335
|
+
assert.strictEqual(await c.value, 6);
|
|
336
|
+
assert.strictEqual(gate, 1);
|
|
337
|
+
a.value = 7;
|
|
338
|
+
assert.strictEqual(await c.value, 6);
|
|
339
|
+
assert.strictEqual(gate, 1);
|
|
340
|
+
});
|
|
341
|
+
it('ignore in sync dependencies', async function () {
|
|
342
|
+
let gate = 0;
|
|
343
|
+
const a = new Ref(5);
|
|
344
|
+
const b = new Computed(async (value) => {
|
|
345
|
+
return value(a) % 2 + 5;
|
|
346
|
+
});
|
|
347
|
+
const c = new Computed(async (value) => await value(b));
|
|
348
|
+
const d = new Computed(async (value) => {
|
|
349
|
+
gate++;
|
|
350
|
+
return await value(c);
|
|
351
|
+
});
|
|
352
|
+
assert.strictEqual(await d.value, 6);
|
|
353
|
+
assert.strictEqual(gate, 1);
|
|
354
|
+
a.value = 7;
|
|
355
|
+
assert.strictEqual(await d.value, 6);
|
|
356
|
+
assert.strictEqual(gate, 1);
|
|
357
|
+
});
|
|
307
358
|
it('reset computed', async function () {
|
|
308
359
|
const a = new Ref(5);
|
|
309
360
|
let gate = 0;
|
package/lib/effect.js
CHANGED
|
@@ -31,21 +31,48 @@ export default class Effect {
|
|
|
31
31
|
trackDependency = this.innerTrackDependency.bind(this);
|
|
32
32
|
run() {
|
|
33
33
|
let firstRun = this.state === EffectState.Initial;
|
|
34
|
-
|
|
35
|
-
const inSync = [...this.dependencies.entries()].every(([d, inSync]) => {
|
|
36
|
-
if (!inSync) {
|
|
37
|
-
d.value;
|
|
38
|
-
return this.dependencies.get(d);
|
|
39
|
-
}
|
|
40
|
-
return inSync;
|
|
41
|
-
});
|
|
42
|
-
if (inSync) {
|
|
43
|
-
this.state = EffectState.Waiting;
|
|
44
|
-
return InSyncSymbol;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
34
|
+
let checkInSync = this.state === EffectState.Scheduled;
|
|
47
35
|
this.state = EffectState.Running;
|
|
48
36
|
const getResult = () => {
|
|
37
|
+
if (checkInSync) {
|
|
38
|
+
const dependenciesInSync = (iterator = this.dependencies.entries()) => {
|
|
39
|
+
const next = iterator.next();
|
|
40
|
+
if (next.done) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
const [d, inSync] = next.value;
|
|
44
|
+
const completeCheck = () => {
|
|
45
|
+
if (!this.dependencies.get(d)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return dependenciesInSync(iterator);
|
|
49
|
+
};
|
|
50
|
+
if (!inSync) {
|
|
51
|
+
const result = d.value;
|
|
52
|
+
if (result instanceof Promise) {
|
|
53
|
+
return result.then(completeCheck);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return completeCheck();
|
|
57
|
+
};
|
|
58
|
+
const resultMaybePromise = dependenciesInSync();
|
|
59
|
+
if (resultMaybePromise instanceof Promise) {
|
|
60
|
+
return resultMaybePromise.then(result => {
|
|
61
|
+
if (result) {
|
|
62
|
+
this.state = EffectState.Waiting;
|
|
63
|
+
return InSyncSymbol;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
checkInSync = false;
|
|
67
|
+
return getResult();
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
else if (resultMaybePromise) {
|
|
72
|
+
this.state = EffectState.Waiting;
|
|
73
|
+
return InSyncSymbol;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
49
76
|
this.clearDependencies(runPromise);
|
|
50
77
|
this.abortHandler = (() => {
|
|
51
78
|
const handler = {
|
|
@@ -66,6 +93,7 @@ export default class Effect {
|
|
|
66
93
|
const completeRun = (resolve, result, err, async) => {
|
|
67
94
|
if (this.abortHandler.aborted) {
|
|
68
95
|
firstRun = false;
|
|
96
|
+
checkInSync = false;
|
|
69
97
|
if (this.computed || async) {
|
|
70
98
|
return getResult();
|
|
71
99
|
}
|
package/lib/tracker.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export default class Tracker {
|
|
2
|
+
dependents = new Set();
|
|
3
|
+
_value;
|
|
4
|
+
addDependent(dependent) {
|
|
5
|
+
this.dependents.add(dependent);
|
|
6
|
+
}
|
|
7
|
+
removeDependent(dependent) {
|
|
8
|
+
this.dependents.delete(dependent);
|
|
9
|
+
}
|
|
10
|
+
invalidate() {
|
|
11
|
+
for (const dependent of [...this.dependents.keys()]) {
|
|
12
|
+
dependent.invalidate(this);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
get value() {
|
|
16
|
+
return this._value;
|
|
17
|
+
}
|
|
18
|
+
}
|
package/package.json
CHANGED
package/src/computed.test.ts
CHANGED
|
@@ -137,6 +137,26 @@ describe('computed', function () {
|
|
|
137
137
|
assert.strictEqual(gate, 1);
|
|
138
138
|
});
|
|
139
139
|
|
|
140
|
+
it('ignore in sync dependencies', function() {
|
|
141
|
+
let gate = 0;
|
|
142
|
+
const a = new Ref(5);
|
|
143
|
+
const b = new Computed((value) => {
|
|
144
|
+
return value(a) % 2 + 5;
|
|
145
|
+
});
|
|
146
|
+
const c = new Computed((value) => value(b));
|
|
147
|
+
const d = new Computed((value) => {
|
|
148
|
+
gate++;
|
|
149
|
+
return value(c);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
assert.strictEqual(d.value, 6);
|
|
153
|
+
assert.strictEqual(gate, 1);
|
|
154
|
+
|
|
155
|
+
a.value = 7;
|
|
156
|
+
assert.strictEqual(d.value, 6);
|
|
157
|
+
assert.strictEqual(gate, 1);
|
|
158
|
+
});
|
|
159
|
+
|
|
140
160
|
it('compute when forced', function () {
|
|
141
161
|
let gate = 0;
|
|
142
162
|
const a = new Ref(5);
|
|
@@ -351,6 +371,46 @@ describe('computed', function () {
|
|
|
351
371
|
assert.strictEqual(gate, 1);
|
|
352
372
|
});
|
|
353
373
|
|
|
374
|
+
it('ignore same computed values', async function () {
|
|
375
|
+
let gate = 0;
|
|
376
|
+
const a = new Ref(5);
|
|
377
|
+
const b1 = new Computed(async (value) => {
|
|
378
|
+
return value(a) % 2;
|
|
379
|
+
});
|
|
380
|
+
const b2 = new Computed(async () => 5);
|
|
381
|
+
const c = new Computed(async (value) => {
|
|
382
|
+
gate++;
|
|
383
|
+
return await value(b1) + await value(b2);
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
assert.strictEqual(await c.value, 6);
|
|
387
|
+
assert.strictEqual(gate, 1);
|
|
388
|
+
|
|
389
|
+
a.value = 7;
|
|
390
|
+
assert.strictEqual(await c.value, 6);
|
|
391
|
+
assert.strictEqual(gate, 1);
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
it('ignore in sync dependencies', async function() {
|
|
395
|
+
let gate = 0;
|
|
396
|
+
const a = new Ref(5);
|
|
397
|
+
const b = new Computed(async (value) => {
|
|
398
|
+
return value(a) % 2 + 5;
|
|
399
|
+
});
|
|
400
|
+
const c = new Computed(async (value) => await value(b));
|
|
401
|
+
const d = new Computed(async (value) => {
|
|
402
|
+
gate++;
|
|
403
|
+
return await value(c);
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
assert.strictEqual(await d.value, 6);
|
|
407
|
+
assert.strictEqual(gate, 1);
|
|
408
|
+
|
|
409
|
+
a.value = 7;
|
|
410
|
+
assert.strictEqual(await d.value, 6);
|
|
411
|
+
assert.strictEqual(gate, 1);
|
|
412
|
+
});
|
|
413
|
+
|
|
354
414
|
it('reset computed', async function () {
|
|
355
415
|
const a = new Ref(5);
|
|
356
416
|
let gate = 0;
|
package/src/computed.ts
CHANGED
|
@@ -40,10 +40,27 @@ export default class Computed<T> extends Effect implements Dependent, Dependency
|
|
|
40
40
|
if (this.state === EffectState.Initial || this.state === EffectState.Scheduled) {
|
|
41
41
|
const oldValue = this._value!;
|
|
42
42
|
const newValue = this.run() as T;
|
|
43
|
-
if (newValue
|
|
44
|
-
this.
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
if (newValue === InSyncSymbol) {
|
|
44
|
+
this.validateDependents();
|
|
45
|
+
} else {
|
|
46
|
+
if (newValue instanceof Promise) {
|
|
47
|
+
// @ts-expect-error
|
|
48
|
+
this._value = Promise.all([newValue, oldValue])
|
|
49
|
+
.then(([newValue, oldValue]) => {
|
|
50
|
+
if (newValue === InSyncSymbol) {
|
|
51
|
+
this.validateDependents();
|
|
52
|
+
return oldValue;
|
|
53
|
+
}
|
|
54
|
+
if (this.dependents.size > 0 && this.isEqual(newValue, oldValue)) {
|
|
55
|
+
this.validateDependents();
|
|
56
|
+
}
|
|
57
|
+
return newValue;
|
|
58
|
+
});
|
|
59
|
+
} else {
|
|
60
|
+
this._value = newValue;
|
|
61
|
+
if (this.dependents.size > 0 && this.isEqual(newValue, oldValue)) {
|
|
62
|
+
this.validateDependents();
|
|
63
|
+
}
|
|
47
64
|
}
|
|
48
65
|
}
|
|
49
66
|
}
|
package/src/effect.ts
CHANGED
|
@@ -37,24 +37,54 @@ export default class Effect implements Dependent {
|
|
|
37
37
|
|
|
38
38
|
run() {
|
|
39
39
|
let firstRun = this.state === EffectState.Initial;
|
|
40
|
-
|
|
41
|
-
if (this.state === EffectState.Scheduled) {
|
|
42
|
-
const inSync = [...this.dependencies.entries()].every(([d, inSync]) => {
|
|
43
|
-
if (!inSync) {
|
|
44
|
-
d.value;
|
|
45
|
-
return this.dependencies.get(d);
|
|
46
|
-
}
|
|
47
|
-
return inSync;
|
|
48
|
-
});
|
|
49
|
-
if (inSync) {
|
|
50
|
-
this.state = EffectState.Waiting;
|
|
51
|
-
return InSyncSymbol;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
40
|
+
let checkInSync = this.state === EffectState.Scheduled;
|
|
54
41
|
|
|
55
42
|
this.state = EffectState.Running;
|
|
56
43
|
|
|
57
44
|
const getResult = (): unknown | Promise<unknown> => {
|
|
45
|
+
if (checkInSync) {
|
|
46
|
+
const dependenciesInSync = (iterator = this.dependencies.entries()): boolean | Promise<boolean> => {
|
|
47
|
+
const next = iterator.next();
|
|
48
|
+
if (next.done) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const [d, inSync] = next.value;
|
|
53
|
+
|
|
54
|
+
const completeCheck = () => {
|
|
55
|
+
if (!this.dependencies.get(d)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return dependenciesInSync(iterator);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
if (!inSync) {
|
|
62
|
+
const result = d.value;
|
|
63
|
+
if (result instanceof Promise) {
|
|
64
|
+
return result.then(completeCheck);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return completeCheck();
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const resultMaybePromise = dependenciesInSync();
|
|
72
|
+
if (resultMaybePromise instanceof Promise) {
|
|
73
|
+
return resultMaybePromise.then(result => {
|
|
74
|
+
if (result) {
|
|
75
|
+
this.state = EffectState.Waiting;
|
|
76
|
+
return InSyncSymbol;
|
|
77
|
+
} else {
|
|
78
|
+
checkInSync = false;
|
|
79
|
+
return getResult();
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
} else if (resultMaybePromise) {
|
|
83
|
+
this.state = EffectState.Waiting;
|
|
84
|
+
return InSyncSymbol;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
58
88
|
this.clearDependencies(runPromise);
|
|
59
89
|
this.abortHandler = (() => {
|
|
60
90
|
const handler = {
|
|
@@ -76,6 +106,7 @@ export default class Effect implements Dependent {
|
|
|
76
106
|
const completeRun = (resolve: boolean, result: unknown, err: unknown, async: boolean) => {
|
|
77
107
|
if (this.abortHandler!.aborted) {
|
|
78
108
|
firstRun = false;
|
|
109
|
+
checkInSync = false;
|
|
79
110
|
if (this.computed || async) {
|
|
80
111
|
return getResult();
|
|
81
112
|
}
|
package/types/computed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAGjD,OAAO,MAAqC,MAAM,aAAa,CAAC;AAEhE,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AACvI,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,CAAC,CAAC;AACtH,MAAM,CAAC,OAAO,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,EAAE,CAAC;AAI9I,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAE,SAAQ,MAAO,YAAW,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,MAAM,CAAC,CAAI;IACnB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAAW;gBAEhB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,4BAAoB,EAAE,UAAU,CAAC,EAAE,MAAM;IAkBpF,IAAW,KAAK,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAGjD,OAAO,MAAqC,MAAM,aAAa,CAAC;AAEhE,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AACvI,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,CAAC,CAAC;AACtH,MAAM,CAAC,OAAO,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,EAAE,CAAC;AAI9I,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAE,SAAQ,MAAO,YAAW,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,MAAM,CAAC,CAAI;IACnB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAAW;gBAEhB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,4BAAoB,EAAE,UAAU,CAAC,EAAE,MAAM;IAkBpF,IAAW,KAAK,IAAI,CAAC,CA8BpB;IAED,OAAO,CAAC,kBAAkB;IAMnB,YAAY,CAAC,SAAS,EAAE,SAAS;IAOjC,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,gBAAoB,GAAG,IAAI;IAKxE,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC;IAW3C,eAAe;IAaf,KAAK;IAKL,OAAO;CAGjB"}
|
package/types/effect.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AACvI,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhI,oBAAY,WAAW;IACnB,OAAO,IAAA;IACP,OAAO,IAAA;IACP,OAAO,IAAA;IACP,SAAS,IAAA;CACZ;AAED,eAAO,MAAM,YAAY,eAAmB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,MAAO,YAAW,SAAS;IAKhC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAc,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ1E,SAAS,CAAC,KAAK,cAAuB;IACtC,SAAS,CAAC,YAAY,oCAA2C;IACjE,OAAO,CAAC,YAAY,CAAC,CAA6F;gBAErF,MAAM,EAAE,UAAU,EAAmB,QAAQ,UAAQ;IAMlF,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,eAAe,CAAsD;IAE7E,GAAG;
|
|
1
|
+
{"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AACvI,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhI,oBAAY,WAAW;IACnB,OAAO,IAAA;IACP,OAAO,IAAA;IACP,OAAO,IAAA;IACP,SAAS,IAAA;CACZ;AAED,eAAO,MAAM,YAAY,eAAmB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,MAAO,YAAW,SAAS;IAKhC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAc,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ1E,SAAS,CAAC,KAAK,cAAuB;IACtC,SAAS,CAAC,YAAY,oCAA2C;IACjE,OAAO,CAAC,YAAY,CAAC,CAA6F;gBAErF,MAAM,EAAE,UAAU,EAAmB,QAAQ,UAAQ;IAMlF,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,eAAe,CAAsD;IAE7E,GAAG;IA6GH,OAAO,CAAC,iBAAiB;IAOzB,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC;IAa3C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC;IAIxC,OAAO;CASV"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import Dependent from "./dependent.js";
|
|
2
|
+
export default class Tracker<T> {
|
|
3
|
+
protected dependents: Set<Dependent>;
|
|
4
|
+
protected _value?: T;
|
|
5
|
+
addDependent(dependent: Dependent): void;
|
|
6
|
+
removeDependent(dependent: Dependent): void;
|
|
7
|
+
invalidate(): void;
|
|
8
|
+
get value(): T | undefined;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,OAAO,OAAO,CAAC,CAAC;IAC1B,SAAS,CAAC,UAAU,iBAAwB;IAC5C,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEd,YAAY,CAAC,SAAS,EAAE,SAAS;IAIjC,eAAe,CAAC,SAAS,EAAE,SAAS;IAIpC,UAAU,IAAI,IAAI;IAMzB,IAAW,KAAK,kBAEf;CACJ"}
|