async-reactivity 2.0.3 → 2.0.5
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 +10 -2
- package/lib/computed.test.js +18 -0
- package/lib/index.js +1 -0
- package/lib/listener.js +36 -0
- package/lib/listener.test.js +85 -0
- package/lib/watcher.test.js +15 -0
- package/package.json +5 -5
- package/src/computed.test.ts +21 -0
- package/src/computed.ts +10 -2
- package/src/index.ts +2 -1
- package/src/listener.test.ts +106 -0
- package/src/listener.ts +44 -0
- package/src/tracker.ts +1 -4
- package/src/watcher.test.ts +16 -0
- package/types/computed.d.ts.map +1 -1
- package/types/index.d.ts +1 -0
- package/types/index.d.ts.map +1 -1
- package/types/listener.d.ts +18 -0
- package/types/listener.d.ts.map +1 -0
- package/types/listener.test.d.ts +2 -0
- package/types/listener.test.d.ts.map +1 -0
- package/types/tracker.d.ts +1 -4
- package/types/tracker.d.ts.map +1 -1
package/lib/computed.js
CHANGED
|
@@ -41,8 +41,16 @@ export default class Computed extends Tracker {
|
|
|
41
41
|
this.dependencies.set(dependency, true);
|
|
42
42
|
}
|
|
43
43
|
if ([...this.dependencies.keys()].every(d => {
|
|
44
|
-
d
|
|
45
|
-
|
|
44
|
+
if (d instanceof Computed) {
|
|
45
|
+
if (d.state === ComputedState.Valid) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
else if (d.state === ComputedState.Uncertain) {
|
|
49
|
+
d.value;
|
|
50
|
+
return !this.dependencies.get(d);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
46
54
|
})) {
|
|
47
55
|
this.finalizeComputing();
|
|
48
56
|
this.validateDependents();
|
package/lib/computed.test.js
CHANGED
|
@@ -92,6 +92,24 @@ describe('computed', function () {
|
|
|
92
92
|
return value(b) + 5;
|
|
93
93
|
});
|
|
94
94
|
assert.strictEqual(c.value, 6);
|
|
95
|
+
assert.strictEqual(gate, 1);
|
|
96
|
+
a.value = 7;
|
|
97
|
+
assert.strictEqual(c.value, 6);
|
|
98
|
+
assert.strictEqual(gate, 1);
|
|
99
|
+
});
|
|
100
|
+
it('ignore same computed values', function () {
|
|
101
|
+
let gate = 0;
|
|
102
|
+
const a = new Ref(5);
|
|
103
|
+
const b1 = new Computed((value) => {
|
|
104
|
+
return value(a) % 2;
|
|
105
|
+
});
|
|
106
|
+
const b2 = new Computed(() => 5);
|
|
107
|
+
const c = new Computed((value) => {
|
|
108
|
+
gate++;
|
|
109
|
+
return value(b1) + value(b2);
|
|
110
|
+
});
|
|
111
|
+
assert.strictEqual(c.value, 6);
|
|
112
|
+
assert.strictEqual(gate, 1);
|
|
95
113
|
a.value = 7;
|
|
96
114
|
assert.strictEqual(c.value, 6);
|
|
97
115
|
assert.strictEqual(gate, 1);
|
package/lib/index.js
CHANGED
package/lib/listener.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import Tracker from "./tracker.js";
|
|
2
|
+
export default class Listener extends Tracker {
|
|
3
|
+
init;
|
|
4
|
+
start;
|
|
5
|
+
stop;
|
|
6
|
+
listening = false;
|
|
7
|
+
constructor({ init, start, stop }) {
|
|
8
|
+
super();
|
|
9
|
+
this.init = init;
|
|
10
|
+
this.start = start;
|
|
11
|
+
this.stop = stop;
|
|
12
|
+
}
|
|
13
|
+
addDependent(dependent) {
|
|
14
|
+
super.addDependent(dependent);
|
|
15
|
+
if (!this.listening) {
|
|
16
|
+
this.start((value) => {
|
|
17
|
+
this._value = value;
|
|
18
|
+
this.invalidate();
|
|
19
|
+
});
|
|
20
|
+
this.listening = true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
removeDependent(dependent) {
|
|
24
|
+
super.removeDependent(dependent);
|
|
25
|
+
if (this.dependents.size === 0) {
|
|
26
|
+
this.stop();
|
|
27
|
+
this.listening = false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
get value() {
|
|
31
|
+
if (this._value === undefined) {
|
|
32
|
+
this._value = this.init();
|
|
33
|
+
}
|
|
34
|
+
return this._value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import 'mocha';
|
|
2
|
+
import assert from 'assert';
|
|
3
|
+
import { mock } from 'node:test';
|
|
4
|
+
import { Watcher, Listener } from './index.js';
|
|
5
|
+
describe('listener', function () {
|
|
6
|
+
it('wait for dependent', function () {
|
|
7
|
+
assert.doesNotThrow(() => {
|
|
8
|
+
new Listener({
|
|
9
|
+
init: () => { throw new Error(); },
|
|
10
|
+
start: () => { throw new Error(); },
|
|
11
|
+
stop: () => { throw new Error(); },
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
it('init', function () {
|
|
16
|
+
const listener = new Listener({
|
|
17
|
+
init: () => 1,
|
|
18
|
+
start: () => { throw new Error(); },
|
|
19
|
+
stop: () => { throw new Error(); },
|
|
20
|
+
});
|
|
21
|
+
assert.strictEqual(listener.value, 1);
|
|
22
|
+
});
|
|
23
|
+
it('start', async function () {
|
|
24
|
+
const listener = new Listener({
|
|
25
|
+
init: () => 1,
|
|
26
|
+
start: (setter) => {
|
|
27
|
+
setTimeout(() => {
|
|
28
|
+
setter(2);
|
|
29
|
+
}, 10);
|
|
30
|
+
},
|
|
31
|
+
stop: () => { },
|
|
32
|
+
});
|
|
33
|
+
const onChange = mock.fn();
|
|
34
|
+
new Watcher(listener, onChange);
|
|
35
|
+
assert.strictEqual(onChange.mock.callCount(), 1);
|
|
36
|
+
assert.deepStrictEqual(onChange.mock.calls[0].arguments, [1]);
|
|
37
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
38
|
+
assert.strictEqual(onChange.mock.callCount(), 2);
|
|
39
|
+
assert.deepStrictEqual(onChange.mock.calls[1].arguments, [2, 1]);
|
|
40
|
+
});
|
|
41
|
+
it('stop', async function () {
|
|
42
|
+
let gate = false;
|
|
43
|
+
let timeout;
|
|
44
|
+
const listener = new Listener({
|
|
45
|
+
init: () => 1,
|
|
46
|
+
start: (setter) => {
|
|
47
|
+
timeout = setTimeout(() => {
|
|
48
|
+
gate = true;
|
|
49
|
+
setter(2);
|
|
50
|
+
}, 10);
|
|
51
|
+
},
|
|
52
|
+
stop: () => {
|
|
53
|
+
clearTimeout(timeout);
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
const w = new Watcher(listener, () => { });
|
|
57
|
+
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
58
|
+
w.dispose();
|
|
59
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
60
|
+
assert.strictEqual(gate, false);
|
|
61
|
+
});
|
|
62
|
+
it('stop + start', async function () {
|
|
63
|
+
let timeout;
|
|
64
|
+
const listener = new Listener({
|
|
65
|
+
init: () => 1,
|
|
66
|
+
start: (setter) => {
|
|
67
|
+
timeout = setTimeout(() => {
|
|
68
|
+
setter(2);
|
|
69
|
+
}, 10);
|
|
70
|
+
},
|
|
71
|
+
stop: () => {
|
|
72
|
+
clearTimeout(timeout);
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
const onChange = mock.fn();
|
|
76
|
+
const w1 = new Watcher(listener, onChange);
|
|
77
|
+
assert.strictEqual(onChange.mock.callCount(), 1);
|
|
78
|
+
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
79
|
+
w1.dispose();
|
|
80
|
+
new Watcher(listener, onChange);
|
|
81
|
+
assert.strictEqual(onChange.mock.callCount(), 2);
|
|
82
|
+
await new Promise((resolve) => setTimeout(resolve, 15));
|
|
83
|
+
assert.strictEqual(onChange.mock.callCount(), 3);
|
|
84
|
+
});
|
|
85
|
+
});
|
package/lib/watcher.test.js
CHANGED
|
@@ -10,6 +10,21 @@ describe('watcher', function () {
|
|
|
10
10
|
}, false);
|
|
11
11
|
a.value = 6;
|
|
12
12
|
});
|
|
13
|
+
it('sync debounce', async function () {
|
|
14
|
+
const a = new Ref(5);
|
|
15
|
+
let gate = 0;
|
|
16
|
+
new Watcher(a, () => {
|
|
17
|
+
gate++;
|
|
18
|
+
}, false);
|
|
19
|
+
a.value = 6;
|
|
20
|
+
await new Promise(resolve => setTimeout(resolve));
|
|
21
|
+
assert.strictEqual(gate, 1);
|
|
22
|
+
a.value = 7;
|
|
23
|
+
a.value = 8;
|
|
24
|
+
a.value = 9;
|
|
25
|
+
await new Promise(resolve => setTimeout(resolve));
|
|
26
|
+
assert.strictEqual(gate, 2);
|
|
27
|
+
});
|
|
13
28
|
it('async', async function () {
|
|
14
29
|
const a = new Computed(async () => {
|
|
15
30
|
await new Promise(resolve => setTimeout(resolve));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "async-reactivity",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.5",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "types/index.d.ts",
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
"author": "Donatas Lučiūnas",
|
|
23
23
|
"license": "ISC",
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@types/mocha": "^10.0.
|
|
26
|
-
"@types/node": "^20.14.
|
|
27
|
-
"mocha": "^10.
|
|
28
|
-
"typescript": "^5.
|
|
25
|
+
"@types/mocha": "^10.0.8",
|
|
26
|
+
"@types/node": "^20.14.15",
|
|
27
|
+
"mocha": "^10.7.3",
|
|
28
|
+
"typescript": "^5.6.2"
|
|
29
29
|
}
|
|
30
30
|
}
|
package/src/computed.test.ts
CHANGED
|
@@ -107,6 +107,27 @@ describe('computed', function () {
|
|
|
107
107
|
});
|
|
108
108
|
|
|
109
109
|
assert.strictEqual(c.value, 6);
|
|
110
|
+
assert.strictEqual(gate, 1);
|
|
111
|
+
|
|
112
|
+
a.value = 7;
|
|
113
|
+
assert.strictEqual(c.value, 6);
|
|
114
|
+
assert.strictEqual(gate, 1);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('ignore same computed values', function () {
|
|
118
|
+
let gate = 0;
|
|
119
|
+
const a = new Ref(5);
|
|
120
|
+
const b1 = new Computed((value) => {
|
|
121
|
+
return value(a) % 2;
|
|
122
|
+
});
|
|
123
|
+
const b2 = new Computed(() => 5);
|
|
124
|
+
const c = new Computed((value) => {
|
|
125
|
+
gate++;
|
|
126
|
+
return value(b1) + value(b2);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
assert.strictEqual(c.value, 6);
|
|
130
|
+
assert.strictEqual(gate, 1);
|
|
110
131
|
|
|
111
132
|
a.value = 7;
|
|
112
133
|
assert.strictEqual(c.value, 6);
|
package/src/computed.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Dependency from "./dependency.js";
|
|
2
2
|
import Dependent from "./dependent.js";
|
|
3
|
+
import Ref from "./ref.js";
|
|
3
4
|
import Tracker from "./tracker.js";
|
|
4
5
|
|
|
5
6
|
declare type TrackValue = <T>(dependency: Dependency<T>) => T;
|
|
@@ -52,8 +53,15 @@ export default class Computed<T> extends Tracker<T> implements Dependent, Depend
|
|
|
52
53
|
this.dependencies.set(dependency, true);
|
|
53
54
|
}
|
|
54
55
|
if ([...this.dependencies.keys()].every(d => {
|
|
55
|
-
d
|
|
56
|
-
|
|
56
|
+
if (d instanceof Computed) {
|
|
57
|
+
if (d.state === ComputedState.Valid) {
|
|
58
|
+
return true;
|
|
59
|
+
} else if (d.state === ComputedState.Uncertain) {
|
|
60
|
+
d.value;
|
|
61
|
+
return !this.dependencies.get(d);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
57
65
|
})) {
|
|
58
66
|
this.finalizeComputing();
|
|
59
67
|
this.validateDependents();
|
package/src/index.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { default as Computed, ComputeFunc, ComputeFuncScoped } from './computed.
|
|
|
2
2
|
export { default as Ref } from './ref.js';
|
|
3
3
|
export { default as Watcher } from './watcher.js';
|
|
4
4
|
export { default as Dependency } from './dependency.js';
|
|
5
|
-
export { default as Dependent } from './dependent.js';
|
|
5
|
+
export { default as Dependent } from './dependent.js';
|
|
6
|
+
export { default as Listener } from './listener.js';
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import 'mocha';
|
|
2
|
+
import assert from 'assert';
|
|
3
|
+
import { mock } from 'node:test';
|
|
4
|
+
import { Watcher, Listener } from './index.js';
|
|
5
|
+
|
|
6
|
+
describe('listener', function () {
|
|
7
|
+
it('wait for dependent', function () {
|
|
8
|
+
assert.doesNotThrow(() => {
|
|
9
|
+
new Listener({
|
|
10
|
+
init: () => { throw new Error(); },
|
|
11
|
+
start: () => { throw new Error(); },
|
|
12
|
+
stop: () => { throw new Error(); },
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('init', function () {
|
|
18
|
+
const listener = new Listener({
|
|
19
|
+
init: () => 1,
|
|
20
|
+
start: () => { throw new Error(); },
|
|
21
|
+
stop: () => { throw new Error(); },
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
assert.strictEqual(listener.value, 1);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('start', async function () {
|
|
28
|
+
const listener = new Listener({
|
|
29
|
+
init: () => 1,
|
|
30
|
+
start: (setter) => {
|
|
31
|
+
setTimeout(() => {
|
|
32
|
+
setter(2);
|
|
33
|
+
}, 10);
|
|
34
|
+
},
|
|
35
|
+
stop: () => { },
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const onChange = mock.fn();
|
|
39
|
+
new Watcher(listener, onChange);
|
|
40
|
+
|
|
41
|
+
assert.strictEqual(onChange.mock.callCount(), 1);
|
|
42
|
+
assert.deepStrictEqual(onChange.mock.calls[0].arguments, [1]);
|
|
43
|
+
|
|
44
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
45
|
+
|
|
46
|
+
assert.strictEqual(onChange.mock.callCount(), 2);
|
|
47
|
+
assert.deepStrictEqual(onChange.mock.calls[1].arguments, [2, 1]);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('stop', async function () {
|
|
51
|
+
let gate = false;
|
|
52
|
+
let timeout: NodeJS.Timeout;
|
|
53
|
+
const listener = new Listener({
|
|
54
|
+
init: () => 1,
|
|
55
|
+
start: (setter) => {
|
|
56
|
+
timeout = setTimeout(() => {
|
|
57
|
+
gate = true;
|
|
58
|
+
setter(2);
|
|
59
|
+
}, 10);
|
|
60
|
+
},
|
|
61
|
+
stop: () => {
|
|
62
|
+
clearTimeout(timeout);
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const w = new Watcher(listener, () => {});
|
|
67
|
+
|
|
68
|
+
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
69
|
+
|
|
70
|
+
w.dispose();
|
|
71
|
+
|
|
72
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
73
|
+
|
|
74
|
+
assert.strictEqual(gate, false);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('stop + start', async function () {
|
|
78
|
+
let timeout: NodeJS.Timeout;
|
|
79
|
+
const listener = new Listener({
|
|
80
|
+
init: () => 1,
|
|
81
|
+
start: (setter) => {
|
|
82
|
+
timeout = setTimeout(() => {
|
|
83
|
+
setter(2);
|
|
84
|
+
}, 10);
|
|
85
|
+
},
|
|
86
|
+
stop: () => {
|
|
87
|
+
clearTimeout(timeout);
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const onChange = mock.fn();
|
|
92
|
+
const w1 = new Watcher(listener, onChange);
|
|
93
|
+
assert.strictEqual(onChange.mock.callCount(), 1);
|
|
94
|
+
|
|
95
|
+
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
96
|
+
|
|
97
|
+
w1.dispose();
|
|
98
|
+
|
|
99
|
+
new Watcher(listener, onChange);
|
|
100
|
+
assert.strictEqual(onChange.mock.callCount(), 2);
|
|
101
|
+
|
|
102
|
+
await new Promise((resolve) => setTimeout(resolve, 15));
|
|
103
|
+
|
|
104
|
+
assert.strictEqual(onChange.mock.callCount(), 3);
|
|
105
|
+
});
|
|
106
|
+
});
|
package/src/listener.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import Dependency from "./dependency.js";
|
|
2
|
+
import Dependent from "./dependent.js";
|
|
3
|
+
import Tracker from "./tracker.js";
|
|
4
|
+
|
|
5
|
+
export default class Listener<T> extends Tracker<T> implements Dependency<T> {
|
|
6
|
+
private init: () => T;
|
|
7
|
+
private start: (setter: (value: T) => void) => void;
|
|
8
|
+
private stop: () => void;
|
|
9
|
+
private listening = false;
|
|
10
|
+
|
|
11
|
+
constructor({ init, start, stop }: { init: () => T, start: (setter: (value: T) => void) => void, stop: () => void }) {
|
|
12
|
+
super();
|
|
13
|
+
|
|
14
|
+
this.init = init;
|
|
15
|
+
this.start = start;
|
|
16
|
+
this.stop = stop;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public addDependent(dependent: Dependent): void {
|
|
20
|
+
super.addDependent(dependent);
|
|
21
|
+
if (!this.listening) {
|
|
22
|
+
this.start((value) => {
|
|
23
|
+
this._value = value;
|
|
24
|
+
this.invalidate();
|
|
25
|
+
});
|
|
26
|
+
this.listening = true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public removeDependent(dependent: Dependent): void {
|
|
31
|
+
super.removeDependent(dependent);
|
|
32
|
+
if (this.dependents.size === 0) {
|
|
33
|
+
this.stop();
|
|
34
|
+
this.listening = false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public get value() {
|
|
39
|
+
if (this._value === undefined) {
|
|
40
|
+
this._value = this.init();
|
|
41
|
+
}
|
|
42
|
+
return this._value;
|
|
43
|
+
}
|
|
44
|
+
}
|
package/src/tracker.ts
CHANGED
package/src/watcher.test.ts
CHANGED
|
@@ -12,6 +12,22 @@ describe('watcher', function () {
|
|
|
12
12
|
a.value = 6;
|
|
13
13
|
});
|
|
14
14
|
|
|
15
|
+
it('sync debounce', async function () {
|
|
16
|
+
const a = new Ref(5);
|
|
17
|
+
let gate = 0;
|
|
18
|
+
new Watcher(a, () => {
|
|
19
|
+
gate++;
|
|
20
|
+
}, false);
|
|
21
|
+
a.value = 6;
|
|
22
|
+
await new Promise(resolve => setTimeout(resolve));
|
|
23
|
+
assert.strictEqual(gate, 1);
|
|
24
|
+
a.value = 7;
|
|
25
|
+
a.value = 8;
|
|
26
|
+
a.value = 9;
|
|
27
|
+
await new Promise(resolve => setTimeout(resolve));
|
|
28
|
+
assert.strictEqual(gate, 2);
|
|
29
|
+
});
|
|
30
|
+
|
|
15
31
|
it('async', async function () {
|
|
16
32
|
const a = new Computed(async () => {
|
|
17
33
|
await new Promise(resolve => setTimeout(resolve));
|
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;
|
|
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;AAEvC,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC9D,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,CAAC,CAAC;AAC9D,MAAM,CAAC,OAAO,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC;AAWrF,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,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,cAAc,CAAC,CAAI;IAC3B,OAAO,CAAC,qBAAqB,CAAC,CAA0C;IACxE,OAAO,CAAC,yBAAyB,CAAC,CAAgB;gBAEtC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAMlC,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,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC;IAI3C,OAAO,CAAC,kBAAkB;IAMnB,OAAO;CAOjB"}
|
package/types/index.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ export { default as Ref } from './ref.js';
|
|
|
3
3
|
export { default as Watcher } from './watcher.js';
|
|
4
4
|
export { default as Dependency } from './dependency.js';
|
|
5
5
|
export { default as Dependent } from './dependent.js';
|
|
6
|
+
export { default as Listener } from './listener.js';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
package/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import Dependency from "./dependency.js";
|
|
2
|
+
import Dependent from "./dependent.js";
|
|
3
|
+
import Tracker from "./tracker.js";
|
|
4
|
+
export default class Listener<T> extends Tracker<T> implements Dependency<T> {
|
|
5
|
+
private init;
|
|
6
|
+
private start;
|
|
7
|
+
private stop;
|
|
8
|
+
private listening;
|
|
9
|
+
constructor({ init, start, stop }: {
|
|
10
|
+
init: () => T;
|
|
11
|
+
start: (setter: (value: T) => void) => void;
|
|
12
|
+
stop: () => void;
|
|
13
|
+
});
|
|
14
|
+
addDependent(dependent: Dependent): void;
|
|
15
|
+
removeDependent(dependent: Dependent): void;
|
|
16
|
+
get value(): T;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=listener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../src/listener.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAE,YAAW,UAAU,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE;IAQ5G,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAWxC,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAQlD,IAAW,KAAK,MAKf;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener.test.d.ts","sourceRoot":"","sources":["../src/listener.test.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,CAAC"}
|
package/types/tracker.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import Watcher from "./watcher.js";
|
|
3
|
-
type Dependent = Computed<any> | Watcher<any>;
|
|
1
|
+
import Dependent from "./dependent.js";
|
|
4
2
|
export default class Tracker<T> {
|
|
5
3
|
protected dependents: Set<Dependent>;
|
|
6
4
|
protected _value?: T;
|
|
@@ -9,5 +7,4 @@ export default class Tracker<T> {
|
|
|
9
7
|
invalidate(): void;
|
|
10
8
|
get value(): T | undefined;
|
|
11
9
|
}
|
|
12
|
-
export {};
|
|
13
10
|
//# sourceMappingURL=tracker.d.ts.map
|
package/types/tracker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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"}
|