async-reactivity 2.0.19 → 2.0.21
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 -6
- package/lib/computed.test.js +11 -2
- package/lib/deferrer.js +17 -0
- package/lib/listener.js +9 -10
- package/lib/listener.test.js +3 -3
- package/package.json +5 -1
- package/src/computed.test.ts +16 -2
- package/src/computed.ts +29 -9
- package/src/deferrer.ts +16 -0
- package/src/listener.test.ts +3 -3
- package/src/listener.ts +12 -13
- package/src/ref.ts +3 -3
- package/types/computed.d.ts +6 -3
- package/types/computed.d.ts.map +1 -1
- package/types/deferrer.d.ts +7 -0
- package/types/deferrer.d.ts.map +1 -0
- package/types/listener.d.ts +3 -3
- package/types/listener.d.ts.map +1 -1
- package/types/ref.d.ts +2 -2
- package/types/ref.d.ts.map +1 -1
- package/lib/isEqual.js +0 -1
- package/lib/syncListener.js +0 -22
- package/types/index.test.d.ts +0 -2
- package/types/index.test.d.ts.map +0 -1
- package/types/isEqual.d.ts +0 -3
- package/types/isEqual.d.ts.map +0 -1
- package/types/syncListener.d.ts +0 -8
- package/types/syncListener.d.ts.map +0 -1
package/lib/computed.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import Tracker from "./tracker.js";
|
|
2
2
|
import defaultIsEqual from "./defaultIsEqual.js";
|
|
3
|
+
import { Deferrer } from "./deferrer.js";
|
|
4
|
+
import { debounce } from 'lodash-es';
|
|
3
5
|
var ComputedState;
|
|
4
6
|
(function (ComputedState) {
|
|
5
7
|
ComputedState[ComputedState["Invalid"] = 0] = "Invalid";
|
|
@@ -18,11 +20,19 @@ export default class Computed extends Tracker {
|
|
|
18
20
|
computePromise;
|
|
19
21
|
computePromiseActions;
|
|
20
22
|
lastComputeAttemptPromise;
|
|
21
|
-
|
|
23
|
+
deferrer;
|
|
24
|
+
constructor(getter, isEqual = (defaultIsEqual), timeToLive) {
|
|
22
25
|
super();
|
|
23
26
|
this.getter = getter;
|
|
24
27
|
this.isEqual = isEqual;
|
|
25
28
|
this.prepareComputePromise();
|
|
29
|
+
if (timeToLive !== undefined) {
|
|
30
|
+
this.deferrer = new Deferrer(debounce(() => {
|
|
31
|
+
if (this.dependents.size === 0) {
|
|
32
|
+
this.reset();
|
|
33
|
+
}
|
|
34
|
+
}, timeToLive));
|
|
35
|
+
}
|
|
26
36
|
}
|
|
27
37
|
prepareComputePromise() {
|
|
28
38
|
this.computePromise = new Promise((resolve, reject) => {
|
|
@@ -61,7 +71,7 @@ export default class Computed extends Tracker {
|
|
|
61
71
|
}
|
|
62
72
|
}
|
|
63
73
|
this.state = ComputedState.Computing;
|
|
64
|
-
this.clearDependencies();
|
|
74
|
+
this.clearDependencies(true);
|
|
65
75
|
const newValue = this.getter(this.trackDependency, this._value);
|
|
66
76
|
if (this.isEqual(newValue, this._value)) {
|
|
67
77
|
this.handlePromiseThen(this.lastComputeAttemptPromise, this._value);
|
|
@@ -80,9 +90,9 @@ export default class Computed extends Tracker {
|
|
|
80
90
|
}
|
|
81
91
|
return this._value;
|
|
82
92
|
}
|
|
83
|
-
clearDependencies() {
|
|
93
|
+
clearDependencies(compute) {
|
|
84
94
|
for (const dependency of this.dependencies.keys()) {
|
|
85
|
-
dependency.removeDependent(this, this.computePromise);
|
|
95
|
+
dependency.removeDependent(this, compute ? this.computePromise : undefined);
|
|
86
96
|
}
|
|
87
97
|
this.dependencies.clear();
|
|
88
98
|
}
|
|
@@ -134,11 +144,18 @@ export default class Computed extends Tracker {
|
|
|
134
144
|
dependent.validate(this);
|
|
135
145
|
}
|
|
136
146
|
}
|
|
137
|
-
|
|
138
|
-
|
|
147
|
+
removeDependent(dependent, promise = Promise.resolve()) {
|
|
148
|
+
super.removeDependent(dependent);
|
|
149
|
+
this.deferrer?.finally(promise);
|
|
150
|
+
}
|
|
151
|
+
reset() {
|
|
152
|
+
this.clearDependencies(false);
|
|
139
153
|
this.state = ComputedState.Invalid;
|
|
140
154
|
this._value = undefined;
|
|
141
155
|
this.lastComputeAttemptPromise = undefined;
|
|
142
156
|
this.prepareComputePromise();
|
|
143
157
|
}
|
|
158
|
+
dispose() {
|
|
159
|
+
this.reset();
|
|
160
|
+
}
|
|
144
161
|
}
|
package/lib/computed.test.js
CHANGED
|
@@ -243,7 +243,7 @@ describe('async computed', function () {
|
|
|
243
243
|
});
|
|
244
244
|
assert.rejects(() => a.value);
|
|
245
245
|
});
|
|
246
|
-
it('
|
|
246
|
+
it('reset computed', async function () {
|
|
247
247
|
const a = new Ref(5);
|
|
248
248
|
let gate = 0;
|
|
249
249
|
const b = new Computed(value => {
|
|
@@ -252,8 +252,17 @@ describe('async computed', function () {
|
|
|
252
252
|
});
|
|
253
253
|
b.value;
|
|
254
254
|
assert.strictEqual(gate, 1);
|
|
255
|
-
b.
|
|
255
|
+
b.reset();
|
|
256
256
|
b.value;
|
|
257
257
|
assert.strictEqual(gate, 2);
|
|
258
258
|
});
|
|
259
|
+
it('auto reset', async function () {
|
|
260
|
+
const a = new Computed(() => true, undefined, 0);
|
|
261
|
+
const b = new Computed(value => value(a));
|
|
262
|
+
assert.strictEqual(b.value, true);
|
|
263
|
+
b.dispose();
|
|
264
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
265
|
+
// @ts-expect-error
|
|
266
|
+
assert.strictEqual(a._value, undefined);
|
|
267
|
+
});
|
|
259
268
|
});
|
package/lib/deferrer.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class Deferrer {
|
|
2
|
+
callback;
|
|
3
|
+
lastPromise;
|
|
4
|
+
constructor(callback) {
|
|
5
|
+
this.callback = callback;
|
|
6
|
+
}
|
|
7
|
+
finally(promise) {
|
|
8
|
+
const currentPromise = Promise.all([this.lastPromise, promise])
|
|
9
|
+
.finally(() => {
|
|
10
|
+
if (this.lastPromise === currentPromise) {
|
|
11
|
+
this.lastPromise = undefined;
|
|
12
|
+
this.callback();
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
this.lastPromise = currentPromise;
|
|
16
|
+
}
|
|
17
|
+
}
|
package/lib/listener.js
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import Ref from "./ref.js";
|
|
2
2
|
import defaultIsEqual from "./defaultIsEqual.js";
|
|
3
|
+
import { Deferrer } from "./deferrer.js";
|
|
3
4
|
export default class Listener extends Ref {
|
|
4
5
|
start;
|
|
5
6
|
stop;
|
|
6
7
|
listening = false;
|
|
7
|
-
|
|
8
|
+
deferrer;
|
|
8
9
|
constructor(_value, start, stop, isEqual = (defaultIsEqual)) {
|
|
9
10
|
super(_value, isEqual);
|
|
10
11
|
this.start = start;
|
|
11
12
|
this.stop = stop;
|
|
13
|
+
this.deferrer = new Deferrer(() => {
|
|
14
|
+
if (this.dependents.size === 0) {
|
|
15
|
+
this.listening = false;
|
|
16
|
+
this.stop();
|
|
17
|
+
}
|
|
18
|
+
});
|
|
12
19
|
}
|
|
13
20
|
addDependent(dependent) {
|
|
14
21
|
super.addDependent(dependent);
|
|
@@ -19,14 +26,6 @@ export default class Listener extends Ref {
|
|
|
19
26
|
}
|
|
20
27
|
removeDependent(dependent, promise = Promise.resolve()) {
|
|
21
28
|
super.removeDependent(dependent);
|
|
22
|
-
|
|
23
|
-
if (this.lastPromise === currentPromise) {
|
|
24
|
-
if (this.dependents.size === 0) {
|
|
25
|
-
this.listening = false;
|
|
26
|
-
this.stop();
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
this.lastPromise = currentPromise;
|
|
29
|
+
this.deferrer.finally(promise);
|
|
31
30
|
}
|
|
32
31
|
}
|
package/lib/listener.test.js
CHANGED
|
@@ -82,17 +82,17 @@ describe('listener', function () {
|
|
|
82
82
|
}, () => { });
|
|
83
83
|
const a = new Ref(5);
|
|
84
84
|
const b = new Computed(async (value) => {
|
|
85
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
85
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
86
86
|
return value(a) + value(listener);
|
|
87
87
|
});
|
|
88
88
|
const c = new Watcher(listener, () => { });
|
|
89
89
|
b.value;
|
|
90
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
90
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
91
91
|
assert.strictEqual(gate, 1);
|
|
92
92
|
a.value = 6;
|
|
93
93
|
b.value;
|
|
94
94
|
c.dispose();
|
|
95
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
95
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
96
96
|
assert.strictEqual(gate, 1);
|
|
97
97
|
});
|
|
98
98
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "async-reactivity",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.21",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "types/index.d.ts",
|
|
@@ -22,9 +22,13 @@
|
|
|
22
22
|
"author": "Donatas Lučiūnas",
|
|
23
23
|
"license": "ISC",
|
|
24
24
|
"devDependencies": {
|
|
25
|
+
"@types/lodash-es": "^4.17.12",
|
|
25
26
|
"@types/mocha": "^10.0.8",
|
|
26
27
|
"@types/node": "^22.13.11",
|
|
27
28
|
"mocha": "^10.7.3",
|
|
28
29
|
"typescript": "^5.8.2"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"lodash-es": "^4.17.21"
|
|
29
33
|
}
|
|
30
34
|
}
|
package/src/computed.test.ts
CHANGED
|
@@ -280,7 +280,7 @@ describe('async computed', function () {
|
|
|
280
280
|
assert.rejects(() => a.value);
|
|
281
281
|
});
|
|
282
282
|
|
|
283
|
-
it('
|
|
283
|
+
it('reset computed', async function () {
|
|
284
284
|
const a = new Ref(5);
|
|
285
285
|
let gate = 0;
|
|
286
286
|
const b = new Computed(value => {
|
|
@@ -289,8 +289,22 @@ describe('async computed', function () {
|
|
|
289
289
|
});
|
|
290
290
|
b.value;
|
|
291
291
|
assert.strictEqual(gate, 1);
|
|
292
|
-
b.
|
|
292
|
+
b.reset();
|
|
293
293
|
b.value;
|
|
294
294
|
assert.strictEqual(gate, 2);
|
|
295
295
|
});
|
|
296
|
+
|
|
297
|
+
it('auto reset', async function() {
|
|
298
|
+
const a = new Computed(() => true, undefined, 0);
|
|
299
|
+
const b = new Computed(value => value(a));
|
|
300
|
+
|
|
301
|
+
assert.strictEqual(b.value, true);
|
|
302
|
+
|
|
303
|
+
b.dispose();
|
|
304
|
+
|
|
305
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
306
|
+
|
|
307
|
+
// @ts-expect-error
|
|
308
|
+
assert.strictEqual(a._value, undefined);
|
|
309
|
+
});
|
|
296
310
|
});
|
package/src/computed.ts
CHANGED
|
@@ -2,6 +2,8 @@ import Dependency from "./dependency.js";
|
|
|
2
2
|
import Dependent from "./dependent.js";
|
|
3
3
|
import Tracker from "./tracker.js";
|
|
4
4
|
import defaultIsEqual from "./defaultIsEqual.js";
|
|
5
|
+
import { Deferrer } from "./deferrer.js";
|
|
6
|
+
import { debounce } from 'lodash-es';
|
|
5
7
|
|
|
6
8
|
export declare type TrackValue = <T>(dependency: Dependency<T>) => T;
|
|
7
9
|
export declare type ComputeFunc<T> = (value: TrackValue, previousValue?: T) => T;
|
|
@@ -16,20 +18,29 @@ enum ComputedState {
|
|
|
16
18
|
|
|
17
19
|
class CircularDependencyError extends Error { }
|
|
18
20
|
|
|
19
|
-
export default class Computed<T
|
|
21
|
+
export default class Computed<T> extends Tracker<T> implements Dependent, Dependency<T> {
|
|
20
22
|
getter: ComputeFunc<T>;
|
|
21
|
-
isEqual: typeof defaultIsEqual<
|
|
23
|
+
isEqual: typeof defaultIsEqual<T>;
|
|
22
24
|
private state = ComputedState.Invalid;
|
|
23
25
|
private dependencies = new Map<Dependency<any>, boolean>();
|
|
24
26
|
private computePromise?: Promise<any>;
|
|
25
27
|
private computePromiseActions?: { resolve: Function, reject: Function };
|
|
26
28
|
private lastComputeAttemptPromise?: Promise<void>;
|
|
29
|
+
private deferrer?: Deferrer;
|
|
27
30
|
|
|
28
|
-
constructor(getter: ComputeFunc<T>, isEqual = defaultIsEqual<
|
|
31
|
+
constructor(getter: ComputeFunc<T>, isEqual = defaultIsEqual<T>, timeToLive?: number) {
|
|
29
32
|
super();
|
|
30
33
|
this.getter = getter;
|
|
31
34
|
this.isEqual = isEqual;
|
|
32
35
|
this.prepareComputePromise();
|
|
36
|
+
|
|
37
|
+
if (timeToLive !== undefined) {
|
|
38
|
+
this.deferrer = new Deferrer(debounce(() => {
|
|
39
|
+
if (this.dependents.size === 0) {
|
|
40
|
+
this.reset();
|
|
41
|
+
}
|
|
42
|
+
}, timeToLive));
|
|
43
|
+
}
|
|
33
44
|
}
|
|
34
45
|
|
|
35
46
|
private prepareComputePromise() {
|
|
@@ -72,7 +83,7 @@ export default class Computed<T extends TBase, TBase = T> extends Tracker<T> imp
|
|
|
72
83
|
}
|
|
73
84
|
|
|
74
85
|
this.state = ComputedState.Computing;
|
|
75
|
-
this.clearDependencies();
|
|
86
|
+
this.clearDependencies(true);
|
|
76
87
|
|
|
77
88
|
const newValue: T = this.getter(this.trackDependency, this._value);
|
|
78
89
|
if (this.isEqual(newValue, this._value!)) {
|
|
@@ -91,9 +102,9 @@ export default class Computed<T extends TBase, TBase = T> extends Tracker<T> imp
|
|
|
91
102
|
return this._value!;
|
|
92
103
|
}
|
|
93
104
|
|
|
94
|
-
private clearDependencies() {
|
|
105
|
+
private clearDependencies(compute: boolean) {
|
|
95
106
|
for (const dependency of this.dependencies.keys()) {
|
|
96
|
-
dependency.removeDependent(this, this.computePromise);
|
|
107
|
+
dependency.removeDependent(this, compute ? this.computePromise : undefined);
|
|
97
108
|
}
|
|
98
109
|
this.dependencies.clear();
|
|
99
110
|
}
|
|
@@ -112,7 +123,7 @@ export default class Computed<T extends TBase, TBase = T> extends Tracker<T> imp
|
|
|
112
123
|
}
|
|
113
124
|
}
|
|
114
125
|
|
|
115
|
-
private innerTrackDependency(this: Computed<T
|
|
126
|
+
private innerTrackDependency(this: Computed<T>, dependency: Dependency<any>) {
|
|
116
127
|
if (this.dependents.has(dependency as any)) {
|
|
117
128
|
throw new CircularDependencyError();
|
|
118
129
|
}
|
|
@@ -154,11 +165,20 @@ export default class Computed<T extends TBase, TBase = T> extends Tracker<T> imp
|
|
|
154
165
|
}
|
|
155
166
|
}
|
|
156
167
|
|
|
157
|
-
public
|
|
158
|
-
|
|
168
|
+
public removeDependent(dependent: Dependent, promise = Promise.resolve()): void {
|
|
169
|
+
super.removeDependent(dependent);
|
|
170
|
+
this.deferrer?.finally(promise);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public reset() {
|
|
174
|
+
this.clearDependencies(false);
|
|
159
175
|
this.state = ComputedState.Invalid;
|
|
160
176
|
this._value = undefined;
|
|
161
177
|
this.lastComputeAttemptPromise = undefined;
|
|
162
178
|
this.prepareComputePromise();
|
|
163
179
|
}
|
|
180
|
+
|
|
181
|
+
public dispose() {
|
|
182
|
+
this.reset();
|
|
183
|
+
}
|
|
164
184
|
}
|
package/src/deferrer.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export class Deferrer {
|
|
2
|
+
private lastPromise?: Promise<any>;
|
|
3
|
+
|
|
4
|
+
constructor(private readonly callback: Function) { }
|
|
5
|
+
|
|
6
|
+
finally(promise: Promise<any>) {
|
|
7
|
+
const currentPromise = Promise.all([this.lastPromise, promise])
|
|
8
|
+
.finally(() => {
|
|
9
|
+
if (this.lastPromise === currentPromise) {
|
|
10
|
+
this.lastPromise = undefined;
|
|
11
|
+
this.callback();
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
this.lastPromise = currentPromise;
|
|
15
|
+
}
|
|
16
|
+
}
|
package/src/listener.test.ts
CHANGED
|
@@ -134,20 +134,20 @@ describe('listener', function () {
|
|
|
134
134
|
const a = new Ref(5);
|
|
135
135
|
|
|
136
136
|
const b = new Computed(async value => {
|
|
137
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
137
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
138
138
|
return value(a) + value(listener);
|
|
139
139
|
});
|
|
140
140
|
|
|
141
141
|
const c = new Watcher(listener, () => {});
|
|
142
142
|
|
|
143
143
|
b.value;
|
|
144
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
144
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
145
145
|
assert.strictEqual(gate, 1);
|
|
146
146
|
|
|
147
147
|
a.value = 6;
|
|
148
148
|
b.value;
|
|
149
149
|
c.dispose();
|
|
150
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
150
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
151
151
|
assert.strictEqual(gate, 1);
|
|
152
152
|
});
|
|
153
153
|
});
|
package/src/listener.ts
CHANGED
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
import Dependent from "./dependent.js";
|
|
2
2
|
import Ref from "./ref.js";
|
|
3
3
|
import defaultIsEqual from "./defaultIsEqual.js";
|
|
4
|
+
import { Deferrer } from "./deferrer.js";
|
|
4
5
|
|
|
5
|
-
export default class Listener<T
|
|
6
|
+
export default class Listener<T> extends Ref<T> {
|
|
6
7
|
private start: () => void;
|
|
7
8
|
private stop: () => void;
|
|
8
9
|
private listening = false;
|
|
9
|
-
private
|
|
10
|
+
private deferrer: Deferrer;
|
|
10
11
|
|
|
11
|
-
constructor(_value: T, start: () => void, stop: () => void, isEqual = defaultIsEqual<
|
|
12
|
+
constructor(_value: T, start: () => void, stop: () => void, isEqual = defaultIsEqual<T>) {
|
|
12
13
|
super(_value, isEqual);
|
|
13
14
|
|
|
14
15
|
this.start = start;
|
|
15
16
|
this.stop = stop;
|
|
17
|
+
|
|
18
|
+
this.deferrer = new Deferrer(() => {
|
|
19
|
+
if (this.dependents.size === 0) {
|
|
20
|
+
this.listening = false;
|
|
21
|
+
this.stop();
|
|
22
|
+
}
|
|
23
|
+
});
|
|
16
24
|
}
|
|
17
25
|
|
|
18
26
|
public addDependent(dependent: Dependent): void {
|
|
@@ -25,15 +33,6 @@ export default class Listener<T extends TBase, TBase = T> extends Ref<T> {
|
|
|
25
33
|
|
|
26
34
|
public removeDependent(dependent: Dependent, promise = Promise.resolve()): void {
|
|
27
35
|
super.removeDependent(dependent);
|
|
28
|
-
|
|
29
|
-
const currentPromise = Promise.all([promise, this.lastPromise]).finally(() => {
|
|
30
|
-
if (this.lastPromise === currentPromise) {
|
|
31
|
-
if (this.dependents.size === 0) {
|
|
32
|
-
this.listening = false;
|
|
33
|
-
this.stop();
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
this.lastPromise = currentPromise;
|
|
36
|
+
this.deferrer.finally(promise);
|
|
38
37
|
}
|
|
39
38
|
}
|
package/src/ref.ts
CHANGED
|
@@ -2,10 +2,10 @@ import Dependency from "./dependency.js";
|
|
|
2
2
|
import Tracker from "./tracker.js";
|
|
3
3
|
import defaultIsEqual from "./defaultIsEqual.js";
|
|
4
4
|
|
|
5
|
-
export default class Ref<T
|
|
6
|
-
private isEqual: typeof defaultIsEqual<
|
|
5
|
+
export default class Ref<T> extends Tracker<T> implements Dependency<T> {
|
|
6
|
+
private isEqual: typeof defaultIsEqual<T>;
|
|
7
7
|
|
|
8
|
-
constructor(_value: T, isEqual = defaultIsEqual<
|
|
8
|
+
constructor(_value: T, isEqual = defaultIsEqual<T>) {
|
|
9
9
|
super();
|
|
10
10
|
this._value = _value;
|
|
11
11
|
this.isEqual = isEqual;
|
package/types/computed.d.ts
CHANGED
|
@@ -5,15 +5,16 @@ import defaultIsEqual from "./defaultIsEqual.js";
|
|
|
5
5
|
export declare type TrackValue = <T>(dependency: Dependency<T>) => T;
|
|
6
6
|
export declare type ComputeFunc<T> = (value: TrackValue, previousValue?: T) => T;
|
|
7
7
|
export declare type ComputeFuncScoped<T1, T2> = (value: TrackValue, scope: T1, previousValue?: T2) => T2;
|
|
8
|
-
export default class Computed<T
|
|
8
|
+
export default class Computed<T> extends Tracker<T> implements Dependent, Dependency<T> {
|
|
9
9
|
getter: ComputeFunc<T>;
|
|
10
|
-
isEqual: typeof defaultIsEqual<
|
|
10
|
+
isEqual: typeof defaultIsEqual<T>;
|
|
11
11
|
private state;
|
|
12
12
|
private dependencies;
|
|
13
13
|
private computePromise?;
|
|
14
14
|
private computePromiseActions?;
|
|
15
15
|
private lastComputeAttemptPromise?;
|
|
16
|
-
|
|
16
|
+
private deferrer?;
|
|
17
|
+
constructor(getter: ComputeFunc<T>, isEqual?: (v1: T, v2: T) => boolean, timeToLive?: number);
|
|
17
18
|
private prepareComputePromise;
|
|
18
19
|
get value(): T;
|
|
19
20
|
private compute;
|
|
@@ -27,6 +28,8 @@ export default class Computed<T extends TBase, TBase = T> extends Tracker<T> imp
|
|
|
27
28
|
forceInvalidate(): void;
|
|
28
29
|
validate(dependency: Dependency<any>): void;
|
|
29
30
|
private validateDependents;
|
|
31
|
+
removeDependent(dependent: Dependent, promise?: Promise<void>): void;
|
|
32
|
+
reset(): void;
|
|
30
33
|
dispose(): void;
|
|
31
34
|
}
|
|
32
35
|
//# sourceMappingURL=computed.d.ts.map
|
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,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,cAAc,MAAM,qBAAqB,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,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAIjD,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACrE,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AACjF,MAAM,CAAC,OAAO,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AAWzG,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAE,YAAW,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IACnF,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,cAAc,CAAC,CAAe;IACtC,OAAO,CAAC,qBAAqB,CAAC,CAA0C;IACxE,OAAO,CAAC,yBAAyB,CAAC,CAAgB;IAClD,OAAO,CAAC,QAAQ,CAAC,CAAW;gBAEhB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,4BAAoB,EAAE,UAAU,CAAC,EAAE,MAAM;IAepF,OAAO,CAAC,qBAAqB;IAS7B,IAAW,KAAK,IAAI,CAAC,CAMpB;IAED,OAAO,CAAC,OAAO;IA0Cf,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,eAAe,CAAwC;IAE/D,OAAO,CAAC,iBAAiB;IAMlB,UAAU;IAUV,eAAe;IAKf,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC;IAI3C,OAAO,CAAC,kBAAkB;IAMnB,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,gBAAoB,GAAG,IAAI;IAKxE,KAAK;IAQL,OAAO;CAGjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferrer.d.ts","sourceRoot":"","sources":["../src/deferrer.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ;IAGL,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,WAAW,CAAC,CAAe;gBAEN,QAAQ,EAAE,QAAQ;IAE/C,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;CAUhC"}
|
package/types/listener.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import Dependent from "./dependent.js";
|
|
2
2
|
import Ref from "./ref.js";
|
|
3
|
-
export default class Listener<T
|
|
3
|
+
export default class Listener<T> extends Ref<T> {
|
|
4
4
|
private start;
|
|
5
5
|
private stop;
|
|
6
6
|
private listening;
|
|
7
|
-
private
|
|
8
|
-
constructor(_value: T, start: () => void, stop: () => void, isEqual?: (v1:
|
|
7
|
+
private deferrer;
|
|
8
|
+
constructor(_value: T, start: () => void, stop: () => void, isEqual?: (v1: T, v2: T) => boolean);
|
|
9
9
|
addDependent(dependent: Dependent): void;
|
|
10
10
|
removeDependent(dependent: Dependent, promise?: Promise<void>): void;
|
|
11
11
|
}
|
package/types/listener.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../src/listener.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,GAAG,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../src/listener.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,GAAG,MAAM,UAAU,CAAC;AAI3B,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAE,SAAQ,GAAG,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAW;gBAEf,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,OAAO,4BAAoB;IAchF,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAQxC,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,gBAAoB,GAAG,IAAI;CAIlF"}
|
package/types/ref.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import Dependency from "./dependency.js";
|
|
2
2
|
import Tracker from "./tracker.js";
|
|
3
|
-
export default class Ref<T
|
|
3
|
+
export default class Ref<T> extends Tracker<T> implements Dependency<T> {
|
|
4
4
|
private isEqual;
|
|
5
|
-
constructor(_value: T, isEqual?: (v1:
|
|
5
|
+
constructor(_value: T, isEqual?: (v1: T, v2: T) => boolean);
|
|
6
6
|
set value(_value: T);
|
|
7
7
|
get value(): T;
|
|
8
8
|
}
|
package/types/ref.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../src/ref.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,OAAO,MAAM,cAAc,CAAC;AAGnC,MAAM,CAAC,OAAO,OAAO,GAAG,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../src/ref.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,OAAO,MAAM,cAAc,CAAC;AAGnC,MAAM,CAAC,OAAO,OAAO,GAAG,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAE,YAAW,UAAU,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,OAAO,CAA2B;gBAE9B,MAAM,EAAE,CAAC,EAAE,OAAO,4BAAoB;IAMlD,IAAW,KAAK,CAAC,MAAM,EAAE,CAAC,EAMzB;IAED,IAAW,KAAK,IAAI,CAAC,CAEpB;CACJ"}
|
package/lib/isEqual.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default (v1, v2) => v1 === v2;
|
package/lib/syncListener.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import Listener from "./listener.js";
|
|
2
|
-
export default class AsyncListener extends Listener {
|
|
3
|
-
promiseResolve;
|
|
4
|
-
constructor(start, stop) {
|
|
5
|
-
let promiseResolve;
|
|
6
|
-
super(new Promise(resolve => {
|
|
7
|
-
promiseResolve = resolve;
|
|
8
|
-
}), start, stop);
|
|
9
|
-
this.promiseResolve = promiseResolve;
|
|
10
|
-
}
|
|
11
|
-
set value(_value) {
|
|
12
|
-
if (this.promiseResolve) {
|
|
13
|
-
_value.then(this.promiseResolve);
|
|
14
|
-
this.promiseResolve = undefined;
|
|
15
|
-
this._value = _value; // prevent invalidate
|
|
16
|
-
}
|
|
17
|
-
super.value = _value;
|
|
18
|
-
}
|
|
19
|
-
get value() {
|
|
20
|
-
return super.value;
|
|
21
|
-
}
|
|
22
|
-
}
|
package/types/index.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,CAAC"}
|
package/types/isEqual.d.ts
DELETED
package/types/isEqual.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"isEqual.d.ts","sourceRoot":"","sources":["../src/isEqual.ts"],"names":[],"mappings":"yBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;AAAjC,wBAAgD"}
|
package/types/syncListener.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import Listener from "./listener.js";
|
|
2
|
-
export default class AsyncListener<T> extends Listener<Promise<T>> {
|
|
3
|
-
private promiseResolve?;
|
|
4
|
-
constructor(start: () => void, stop: () => void);
|
|
5
|
-
set value(_value: Promise<T>);
|
|
6
|
-
get value(): Promise<T>;
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=syncListener.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"syncListener.d.ts","sourceRoot":"","sources":["../src/syncListener.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,MAAM,CAAC,OAAO,OAAO,aAAa,CAAC,CAAC,CAAE,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,cAAc,CAAC,CAAqB;gBAEhC,KAAK,EAAE,MAAM,IAAI,EAAE,IAAI,EAAE,MAAM,IAAI;IAQ/C,IAAW,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAOlC;IAED,IAAW,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAE7B;CACJ"}
|