@valentin30/signal 0.0.9 → 0.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/dist/index.d.mts +233 -147
- package/dist/index.d.ts +233 -147
- package/dist/index.js +397 -255
- package/dist/index.mjs +389 -249
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -4,14 +4,74 @@ var __export = (target, all) => {
|
|
|
4
4
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
5
|
};
|
|
6
6
|
|
|
7
|
-
// src/core/
|
|
7
|
+
// src/core/contracts/comparable.ts
|
|
8
|
+
var Equals;
|
|
9
|
+
((Equals2) => {
|
|
10
|
+
function strict(value, other) {
|
|
11
|
+
if (value === other) return true;
|
|
12
|
+
if (value !== value && other !== other) return true;
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
Equals2.strict = strict;
|
|
16
|
+
})(Equals || (Equals = {}));
|
|
17
|
+
function comparator(equals = Equals.strict) {
|
|
18
|
+
return { equals };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// src/core/contracts/readable.ts
|
|
22
|
+
function reader(read) {
|
|
23
|
+
return { read };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// src/core/contracts/writable.ts
|
|
27
|
+
function writer(write) {
|
|
28
|
+
return {
|
|
29
|
+
write(value) {
|
|
30
|
+
const result = write(value);
|
|
31
|
+
if (typeof result === "boolean") return result;
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// src/internal/internal.ts
|
|
38
|
+
var internal_exports = {};
|
|
39
|
+
__export(internal_exports, {
|
|
40
|
+
BasicValue: () => BasicValue,
|
|
41
|
+
BatchWriter: () => BatchWriter,
|
|
42
|
+
CallbackScheduler: () => CallbackScheduler,
|
|
43
|
+
CollectorBasedBatcher: () => CollectorBasedBatcher,
|
|
44
|
+
CollectorController: () => CollectorController,
|
|
45
|
+
Composed: () => Composed,
|
|
46
|
+
ComputedValue: () => ComputedValue,
|
|
47
|
+
DependencyManager: () => DependencyManager,
|
|
48
|
+
EmittingValue: () => EmittingValue,
|
|
49
|
+
Reactive: () => Reactive,
|
|
50
|
+
ScheduledEmitter: () => ScheduledEmitter,
|
|
51
|
+
Snapshot: () => Snapshot
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// src/utils/utils.ts
|
|
55
|
+
var utils_exports = {};
|
|
56
|
+
__export(utils_exports, {
|
|
57
|
+
call: () => call,
|
|
58
|
+
factory: () => factory,
|
|
59
|
+
singleton: () => singleton
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// src/utils/call.ts
|
|
63
|
+
function call(callback) {
|
|
64
|
+
callback();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// src/utils/factory.ts
|
|
8
68
|
function factory(name) {
|
|
9
69
|
let __default__ = null;
|
|
10
70
|
let __factory__ = null;
|
|
11
71
|
function object(...args) {
|
|
12
72
|
if (__factory__) return __factory__(...args);
|
|
13
73
|
if (__default__) return __default__(...args);
|
|
14
|
-
throw new Error(`${name}
|
|
74
|
+
throw new Error(`${name}::factory() not configured!`);
|
|
15
75
|
}
|
|
16
76
|
object.configured = () => __default__ !== null || __factory__ !== null;
|
|
17
77
|
object.default = (factory2) => {
|
|
@@ -23,303 +83,383 @@ function factory(name) {
|
|
|
23
83
|
return object;
|
|
24
84
|
}
|
|
25
85
|
|
|
26
|
-
// src/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
// src/core/computed.ts
|
|
36
|
-
var computed = factory("computed");
|
|
37
|
-
|
|
38
|
-
// src/core/effect.ts
|
|
39
|
-
var effect = factory("effect");
|
|
40
|
-
|
|
41
|
-
// src/core/ignore.ts
|
|
42
|
-
var ignore = factory("ignore");
|
|
43
|
-
|
|
44
|
-
// src/core/signal.ts
|
|
45
|
-
var signal = factory("signal");
|
|
46
|
-
|
|
47
|
-
// src/internal/index.ts
|
|
48
|
-
var internal_exports = {};
|
|
49
|
-
__export(internal_exports, {
|
|
50
|
-
Collector: () => Collector,
|
|
51
|
-
Composed: () => Composed,
|
|
52
|
-
Computed: () => Computed,
|
|
53
|
-
Signal: () => Signal,
|
|
54
|
-
batch: () => batch2,
|
|
55
|
-
collector: () => collector2,
|
|
56
|
-
composed: () => composed2,
|
|
57
|
-
computed: () => computed2,
|
|
58
|
-
effect: () => effect2,
|
|
59
|
-
ignore: () => ignore2,
|
|
60
|
-
shared: () => shared,
|
|
61
|
-
signal: () => signal2
|
|
62
|
-
});
|
|
86
|
+
// src/utils/singleton.ts
|
|
87
|
+
function singleton(factory2) {
|
|
88
|
+
function object() {
|
|
89
|
+
return object.instance ??= factory2();
|
|
90
|
+
}
|
|
91
|
+
object.instance = void 0;
|
|
92
|
+
return object;
|
|
93
|
+
}
|
|
63
94
|
|
|
64
95
|
// src/internal/batch.ts
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
96
|
+
var CollectorBasedBatcher = class {
|
|
97
|
+
collector;
|
|
98
|
+
constructor(collector) {
|
|
99
|
+
this.collector = collector;
|
|
100
|
+
}
|
|
101
|
+
batch(callback, ...args) {
|
|
102
|
+
if (this.collector.collecting()) return callback(...args);
|
|
103
|
+
const [value, collected] = this.collector.collect(callback, ...args);
|
|
104
|
+
collected.forEach(utils_exports.call);
|
|
105
|
+
return value;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
70
108
|
|
|
71
109
|
// src/internal/collector.ts
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
#values;
|
|
77
|
-
constructor(values) {
|
|
78
|
-
this.#values = values;
|
|
110
|
+
var CollectorController = class {
|
|
111
|
+
values;
|
|
112
|
+
constructor(values = null) {
|
|
113
|
+
this.values = values;
|
|
79
114
|
}
|
|
80
115
|
collecting() {
|
|
81
|
-
return this
|
|
116
|
+
return !!this.values;
|
|
82
117
|
}
|
|
83
118
|
add(value) {
|
|
84
|
-
if (!this.
|
|
85
|
-
this
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
this
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
119
|
+
if (!this.values) return;
|
|
120
|
+
this.values.add(value);
|
|
121
|
+
}
|
|
122
|
+
track(value) {
|
|
123
|
+
if (!this.values) return;
|
|
124
|
+
this.values.add(value);
|
|
125
|
+
}
|
|
126
|
+
collect(callback, ...args) {
|
|
127
|
+
const current = this.values;
|
|
128
|
+
this.values = /* @__PURE__ */ new Set();
|
|
129
|
+
const response = [];
|
|
130
|
+
try {
|
|
131
|
+
response[0] = callback(...args);
|
|
132
|
+
} finally {
|
|
133
|
+
response[1] = this.values;
|
|
134
|
+
this.values = current;
|
|
135
|
+
return response;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
ignore(callback, ...args) {
|
|
139
|
+
const current = this.values;
|
|
140
|
+
this.values = null;
|
|
141
|
+
try {
|
|
142
|
+
return callback(...args);
|
|
143
|
+
} finally {
|
|
144
|
+
this.values = current;
|
|
145
|
+
}
|
|
100
146
|
}
|
|
101
147
|
};
|
|
102
148
|
|
|
103
|
-
// src/internal/
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
/* @__PURE__ */ new Set(),
|
|
111
|
-
computed2.collector(),
|
|
112
|
-
compute,
|
|
113
|
-
equals
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
computed2.collector = factory("computed.collector");
|
|
117
|
-
var Computed = class {
|
|
118
|
-
#empty;
|
|
119
|
-
#value;
|
|
120
|
-
#values;
|
|
121
|
-
#dependencies;
|
|
122
|
-
#compute;
|
|
123
|
-
#equals;
|
|
124
|
-
#listeners;
|
|
125
|
-
#collector;
|
|
126
|
-
constructor(empty, value, values, dependencies, listeners, collector3, compute, equals) {
|
|
127
|
-
this.#empty = empty;
|
|
128
|
-
this.#value = value;
|
|
129
|
-
this.#values = values;
|
|
130
|
-
this.#dependencies = dependencies;
|
|
131
|
-
this.#listeners = listeners;
|
|
132
|
-
this.#collector = collector3;
|
|
133
|
-
this.#compute = compute;
|
|
134
|
-
this.#equals = equals;
|
|
149
|
+
// src/internal/composed.ts
|
|
150
|
+
var Composed = class {
|
|
151
|
+
value;
|
|
152
|
+
writer;
|
|
153
|
+
constructor(value, writer2) {
|
|
154
|
+
this.value = value;
|
|
155
|
+
this.writer = writer2;
|
|
135
156
|
}
|
|
136
157
|
read() {
|
|
137
|
-
this
|
|
138
|
-
return this.peek();
|
|
158
|
+
return this.value.read();
|
|
139
159
|
}
|
|
140
160
|
peek() {
|
|
141
|
-
|
|
142
|
-
const current = this.#dependencies;
|
|
143
|
-
const next = this.#collector.collect(() => this.#value = this.#compute());
|
|
144
|
-
this.#dependencies = next;
|
|
145
|
-
this.#values = Array.from(next).map((dep) => [dep, dep.read()]);
|
|
146
|
-
this.#empty = false;
|
|
147
|
-
if (!current.size && !next.size) return this.#value;
|
|
148
|
-
if (!this.#listeners.size) return this.#value;
|
|
149
|
-
current.forEach((dep) => !next.has(dep) && this.#listeners.forEach((listener) => dep.unsubscribe(listener)));
|
|
150
|
-
next.forEach((dep) => !current.has(dep) && this.#listeners.forEach((listener) => dep.subscribe(listener)));
|
|
151
|
-
return this.#value;
|
|
161
|
+
return this.value.peek();
|
|
152
162
|
}
|
|
153
|
-
|
|
154
|
-
if (this
|
|
155
|
-
return this.
|
|
163
|
+
write(value) {
|
|
164
|
+
if (this.value.equals(this.peek(), value)) return false;
|
|
165
|
+
return this.writer.write(value);
|
|
166
|
+
}
|
|
167
|
+
equals(...args) {
|
|
168
|
+
const [value, other] = args.length === 1 ? [this.read(), args[0]] : args;
|
|
169
|
+
return this.value.equals(value, other);
|
|
156
170
|
}
|
|
157
171
|
subscribe(callback) {
|
|
158
|
-
this
|
|
159
|
-
this.#dependencies.forEach((dep) => dep.subscribe(callback));
|
|
160
|
-
return this.unsubscribe.bind(this, callback);
|
|
172
|
+
return this.value.subscribe(callback);
|
|
161
173
|
}
|
|
162
174
|
unsubscribe(callback) {
|
|
163
|
-
this
|
|
164
|
-
this.#dependencies.forEach((dep) => dep.unsubscribe(callback));
|
|
175
|
+
return this.value.unsubscribe(callback);
|
|
165
176
|
}
|
|
166
177
|
};
|
|
167
178
|
|
|
168
|
-
// src/internal/
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
[],
|
|
174
|
-
/* @__PURE__ */ new Set(),
|
|
175
|
-
/* @__PURE__ */ new Set(),
|
|
176
|
-
composed2.batcher(),
|
|
177
|
-
composed2.collector(),
|
|
178
|
-
compute,
|
|
179
|
-
write,
|
|
180
|
-
equals
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
composed2.batcher = factory("composed.batcher");
|
|
184
|
-
composed2.collector = factory("composed.collector");
|
|
185
|
-
var Composed = class extends Computed {
|
|
186
|
-
#batcher;
|
|
187
|
-
#write;
|
|
188
|
-
constructor(empty, value, values, dependencies, listeners, batcher, collector3, compute, write, equals) {
|
|
189
|
-
super(empty, value, values, dependencies, listeners, collector3, compute, equals);
|
|
190
|
-
this.#batcher = batcher;
|
|
191
|
-
this.#write = write;
|
|
179
|
+
// src/internal/dependency.ts
|
|
180
|
+
var Snapshot;
|
|
181
|
+
((Snapshot2) => {
|
|
182
|
+
function changed([value, snapshot]) {
|
|
183
|
+
return !value.equals(value.peek(), snapshot);
|
|
192
184
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
185
|
+
Snapshot2.changed = changed;
|
|
186
|
+
function from(values) {
|
|
187
|
+
if (!values.size) return [];
|
|
188
|
+
return Array.from(values).map(create);
|
|
189
|
+
}
|
|
190
|
+
Snapshot2.from = from;
|
|
191
|
+
function create(value) {
|
|
192
|
+
return [value, value.peek()];
|
|
193
|
+
}
|
|
194
|
+
})(Snapshot || (Snapshot = {}));
|
|
195
|
+
var DependencyManager = class {
|
|
196
|
+
snapshot;
|
|
197
|
+
dependencies;
|
|
198
|
+
collector;
|
|
199
|
+
listeners;
|
|
200
|
+
constructor(collector, listeners = /* @__PURE__ */ new Set(), dependencies = /* @__PURE__ */ new Set(), snapshot = null) {
|
|
201
|
+
this.collector = collector;
|
|
202
|
+
this.listeners = listeners;
|
|
203
|
+
this.dependencies = dependencies;
|
|
204
|
+
this.snapshot = snapshot;
|
|
205
|
+
}
|
|
206
|
+
changed() {
|
|
207
|
+
if (!this.snapshot) return true;
|
|
208
|
+
return this.snapshot.some(Snapshot.changed);
|
|
209
|
+
}
|
|
210
|
+
track(callback) {
|
|
211
|
+
const [_, dependencies] = this.collector.collect(callback);
|
|
212
|
+
if (!this.dependencies.size && !dependencies.size) return;
|
|
213
|
+
this.snapshot = Snapshot.from(dependencies);
|
|
214
|
+
if (this.equals(dependencies)) return;
|
|
215
|
+
if (this.listeners.size) {
|
|
216
|
+
this.dependencies.forEach((dep) => !dependencies.has(dep) && this.listeners.forEach((cb) => dep.unsubscribe(cb)));
|
|
217
|
+
dependencies.forEach((dep) => !this.dependencies.has(dep) && this.listeners.forEach((cb) => dep.subscribe(cb)));
|
|
218
|
+
}
|
|
219
|
+
this.dependencies = dependencies;
|
|
220
|
+
}
|
|
221
|
+
subscribe(callback) {
|
|
222
|
+
this.listeners.add(callback);
|
|
223
|
+
this.dependencies.forEach((dep) => dep.subscribe(callback));
|
|
224
|
+
return () => this.unsubscribe(callback);
|
|
225
|
+
}
|
|
226
|
+
unsubscribe(callback) {
|
|
227
|
+
this.listeners.delete(callback);
|
|
228
|
+
this.dependencies.forEach((dep) => dep.unsubscribe(callback));
|
|
229
|
+
}
|
|
230
|
+
equals(other) {
|
|
231
|
+
if (this.dependencies === other) return true;
|
|
232
|
+
if (this.dependencies.size !== other.size) return false;
|
|
233
|
+
for (const item of this.dependencies) if (!other.has(item)) return false;
|
|
234
|
+
return true;
|
|
196
235
|
}
|
|
197
236
|
};
|
|
198
237
|
|
|
199
|
-
// src/internal/
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
effect2.collector = factory("effect.collector");
|
|
219
|
-
|
|
220
|
-
// src/internal/ignore.ts
|
|
221
|
-
function ignore2(callback, ...args) {
|
|
222
|
-
let value;
|
|
223
|
-
ignore2.collector().ignore(() => value = typeof callback === "function" ? callback(...args) : callback.read());
|
|
224
|
-
return value;
|
|
225
|
-
}
|
|
226
|
-
ignore2.collector = factory("signal.collector");
|
|
227
|
-
|
|
228
|
-
// src/internal/shared.ts
|
|
229
|
-
var __batcher__ = null;
|
|
230
|
-
var __collector__ = null;
|
|
231
|
-
var shared = {
|
|
232
|
-
batcher() {
|
|
233
|
-
if (!__batcher__) __batcher__ = collector();
|
|
234
|
-
return __batcher__;
|
|
235
|
-
},
|
|
236
|
-
collector() {
|
|
237
|
-
if (!__collector__) __collector__ = collector();
|
|
238
|
-
return __collector__;
|
|
238
|
+
// src/internal/emitter.ts
|
|
239
|
+
var ScheduledEmitter = class {
|
|
240
|
+
listeners;
|
|
241
|
+
scheduler;
|
|
242
|
+
constructor(scheduler, listeners = /* @__PURE__ */ new Set()) {
|
|
243
|
+
this.scheduler = scheduler;
|
|
244
|
+
this.listeners = listeners;
|
|
245
|
+
}
|
|
246
|
+
emit() {
|
|
247
|
+
this.scheduler.schedule(...this.listeners);
|
|
248
|
+
}
|
|
249
|
+
subscribe(callback) {
|
|
250
|
+
this.listeners.add(callback);
|
|
251
|
+
return () => this.unsubscribe(callback);
|
|
252
|
+
}
|
|
253
|
+
unsubscribe(callback) {
|
|
254
|
+
this.listeners.delete(callback);
|
|
239
255
|
}
|
|
240
256
|
};
|
|
241
257
|
|
|
242
|
-
// src/internal/
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
#listeners;
|
|
252
|
-
#batcher;
|
|
253
|
-
#collector;
|
|
254
|
-
constructor(value, equals, listeners, batcher, collector3) {
|
|
255
|
-
this.#value = value;
|
|
256
|
-
this.#equals = equals;
|
|
257
|
-
this.#listeners = listeners;
|
|
258
|
-
this.#batcher = batcher;
|
|
259
|
-
this.#collector = collector3;
|
|
258
|
+
// src/internal/reactive.ts
|
|
259
|
+
var Reactive = class {
|
|
260
|
+
value;
|
|
261
|
+
tracker;
|
|
262
|
+
subscription;
|
|
263
|
+
constructor(value, tracker, subscription) {
|
|
264
|
+
this.value = value;
|
|
265
|
+
this.tracker = tracker;
|
|
266
|
+
this.subscription = subscription;
|
|
260
267
|
}
|
|
261
268
|
read() {
|
|
262
|
-
this
|
|
269
|
+
this.tracker.track(this);
|
|
263
270
|
return this.peek();
|
|
264
271
|
}
|
|
265
272
|
peek() {
|
|
266
|
-
return this
|
|
273
|
+
return this.value.read();
|
|
267
274
|
}
|
|
268
275
|
write(value) {
|
|
269
|
-
|
|
270
|
-
this.#value = value;
|
|
271
|
-
if (this.#batcher.collecting()) this.#listeners.forEach((listener) => this.#batcher.add(listener));
|
|
272
|
-
else this.#listeners.forEach((listener) => listener());
|
|
276
|
+
return this.value.write(value);
|
|
273
277
|
}
|
|
274
|
-
equals(
|
|
275
|
-
|
|
276
|
-
return this
|
|
278
|
+
equals(...args) {
|
|
279
|
+
const [value, other] = args.length === 1 ? [this.read(), args[0]] : args;
|
|
280
|
+
return this.value.equals(value, other);
|
|
277
281
|
}
|
|
278
282
|
subscribe(callback) {
|
|
279
|
-
this
|
|
280
|
-
return this.unsubscribe.bind(this, callback);
|
|
283
|
+
return this.subscription.subscribe(callback);
|
|
281
284
|
}
|
|
282
285
|
unsubscribe(callback) {
|
|
283
|
-
this
|
|
286
|
+
return this.subscription.unsubscribe(callback);
|
|
284
287
|
}
|
|
285
288
|
};
|
|
286
289
|
|
|
287
|
-
// src/
|
|
288
|
-
|
|
289
|
-
collector
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
290
|
+
// src/internal/scheduler.ts
|
|
291
|
+
var CallbackScheduler = class {
|
|
292
|
+
collector;
|
|
293
|
+
add;
|
|
294
|
+
constructor(collector) {
|
|
295
|
+
this.collector = collector;
|
|
296
|
+
this.add = this.collector.add.bind(this.collector);
|
|
297
|
+
}
|
|
298
|
+
schedule(...args) {
|
|
299
|
+
if (args.length === 0) return;
|
|
300
|
+
if (!this.collector.collecting()) return args.forEach(utils_exports.call);
|
|
301
|
+
args.forEach(this.add);
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
// src/internal/value.ts
|
|
306
|
+
var BasicValue = class {
|
|
307
|
+
value;
|
|
308
|
+
comparator;
|
|
309
|
+
constructor(value, comparator2) {
|
|
310
|
+
this.value = value;
|
|
311
|
+
this.comparator = comparator2;
|
|
312
|
+
}
|
|
313
|
+
read() {
|
|
314
|
+
return this.value;
|
|
315
|
+
}
|
|
316
|
+
write(value) {
|
|
317
|
+
if (this.comparator.equals(this.value, value)) return false;
|
|
318
|
+
this.value = value;
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
equals(...args) {
|
|
322
|
+
const [value, other] = args.length === 1 ? [this.read(), args[0]] : args;
|
|
323
|
+
return this.comparator.equals(value, other);
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
var EmittingValue = class {
|
|
327
|
+
value;
|
|
328
|
+
emitter;
|
|
329
|
+
constructor(value, emitter) {
|
|
330
|
+
this.value = value;
|
|
331
|
+
this.emitter = emitter;
|
|
332
|
+
}
|
|
333
|
+
read() {
|
|
334
|
+
return this.value.read();
|
|
335
|
+
}
|
|
336
|
+
write(value) {
|
|
337
|
+
const changed = this.value.write(value);
|
|
338
|
+
if (changed) this.emitter.emit();
|
|
339
|
+
return changed;
|
|
340
|
+
}
|
|
341
|
+
equals(...args) {
|
|
342
|
+
const [value, other] = args.length === 1 ? [this.read(), args[0]] : args;
|
|
343
|
+
return this.value.equals(value, other);
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
var ComputedValue = class {
|
|
347
|
+
cache;
|
|
348
|
+
computation;
|
|
349
|
+
dependencies;
|
|
350
|
+
constructor(cache, computation, dependencies) {
|
|
351
|
+
this.cache = cache;
|
|
352
|
+
this.computation = computation;
|
|
353
|
+
this.dependencies = dependencies;
|
|
354
|
+
this.recompute = this.recompute.bind(this);
|
|
355
|
+
}
|
|
356
|
+
read() {
|
|
357
|
+
if (this.dependencies.changed()) this.dependencies.track(this.recompute);
|
|
358
|
+
return this.cache.read();
|
|
359
|
+
}
|
|
360
|
+
recompute() {
|
|
361
|
+
this.cache.write(this.computation.read());
|
|
362
|
+
}
|
|
363
|
+
write(_) {
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
equals(...args) {
|
|
367
|
+
const [value, other] = args.length === 1 ? [this.read(), args[0]] : args;
|
|
368
|
+
return this.cache.equals(value, other);
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
// src/internal/writable.ts
|
|
373
|
+
var BatchWriter = class {
|
|
374
|
+
writer;
|
|
375
|
+
batcher;
|
|
376
|
+
constructor(writer2, batcher) {
|
|
377
|
+
this.writer = writer2;
|
|
378
|
+
this.batcher = batcher;
|
|
379
|
+
}
|
|
380
|
+
write(value) {
|
|
381
|
+
const result = this.batcher.batch(() => this.writer.write(value));
|
|
382
|
+
if (typeof result === "boolean") return result;
|
|
383
|
+
return true;
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
// src/app/index.ts
|
|
388
|
+
function configuration() {
|
|
389
|
+
return __configuration__;
|
|
390
|
+
}
|
|
391
|
+
var __configuration__ = {
|
|
392
|
+
signal: utils_exports.factory("@configuration.signal"),
|
|
393
|
+
computed: utils_exports.factory("@configuration.computed"),
|
|
394
|
+
composed: utils_exports.factory("@configuration.composed"),
|
|
395
|
+
batcher: utils_exports.factory("@configuration.batch"),
|
|
396
|
+
ignorer: utils_exports.factory("@configuration.ignore"),
|
|
397
|
+
// Internal
|
|
398
|
+
scheduler: utils_exports.factory("@configuration.scheduler"),
|
|
399
|
+
tracker: utils_exports.factory("@configuration.tracker"),
|
|
400
|
+
collector: utils_exports.factory("@configuration.collector"),
|
|
401
|
+
dependency_tracker: utils_exports.factory("@configuration.dependency.tracker"),
|
|
402
|
+
dependency_collector: utils_exports.factory("@configuration.dependency.collector"),
|
|
403
|
+
callback_collector: utils_exports.factory("@configuration.callback.collector")
|
|
404
|
+
};
|
|
405
|
+
__configuration__.signal.default((value, equals) => {
|
|
406
|
+
const emitter = new internal_exports.ScheduledEmitter(configuration().scheduler());
|
|
407
|
+
const state = new internal_exports.EmittingValue(new internal_exports.BasicValue(value, comparator(equals)), emitter);
|
|
408
|
+
return new internal_exports.Reactive(state, configuration().tracker(), emitter);
|
|
409
|
+
});
|
|
410
|
+
__configuration__.computed.default((compute, equals) => {
|
|
411
|
+
const dependency = configuration().dependency_tracker();
|
|
412
|
+
const cache = new internal_exports.BasicValue(void 0, comparator(equals));
|
|
413
|
+
const value = new internal_exports.ComputedValue(cache, reader(compute), dependency);
|
|
414
|
+
return new internal_exports.Reactive(value, configuration().tracker(), dependency);
|
|
415
|
+
});
|
|
416
|
+
__configuration__.composed.default(
|
|
417
|
+
(value, write) => new internal_exports.Composed(value, new internal_exports.BatchWriter(writer(write), configuration().batcher()))
|
|
418
|
+
);
|
|
419
|
+
__configuration__.batcher.default(utils_exports.singleton(() => new internal_exports.CollectorBasedBatcher(configuration().callback_collector())));
|
|
420
|
+
__configuration__.ignorer.default(configuration().dependency_collector);
|
|
421
|
+
__configuration__.scheduler.default(utils_exports.singleton(() => new internal_exports.CallbackScheduler(configuration().callback_collector())));
|
|
422
|
+
__configuration__.collector.default(configuration().dependency_collector);
|
|
423
|
+
__configuration__.tracker.default(configuration().dependency_collector);
|
|
424
|
+
__configuration__.dependency_tracker.default(() => new internal_exports.DependencyManager(configuration().collector()));
|
|
425
|
+
__configuration__.dependency_collector.default(utils_exports.singleton(() => new internal_exports.CollectorController()));
|
|
426
|
+
__configuration__.callback_collector.default(utils_exports.singleton(() => new internal_exports.CollectorController()));
|
|
427
|
+
|
|
428
|
+
// src/core/batch.ts
|
|
429
|
+
function batch(callback, ...args) {
|
|
430
|
+
return configuration().batcher().batch(callback, ...args);
|
|
296
431
|
}
|
|
297
432
|
|
|
298
|
-
// src/
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
433
|
+
// src/core/composed.ts
|
|
434
|
+
function composed(value, write) {
|
|
435
|
+
return configuration().composed(value, write);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// src/core/computed.ts
|
|
439
|
+
function computed(compute, equals) {
|
|
440
|
+
return configuration().computed(compute, equals);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// src/core/ignore.ts
|
|
444
|
+
function ignore(callback, ...args) {
|
|
445
|
+
return configuration().ignorer().ignore(callback, ...args);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// src/core/signal.ts
|
|
449
|
+
function signal(value, equals) {
|
|
450
|
+
return configuration().signal(value, equals);
|
|
451
|
+
}
|
|
314
452
|
export {
|
|
453
|
+
Equals,
|
|
454
|
+
internal_exports as Internal,
|
|
315
455
|
batch,
|
|
316
|
-
|
|
456
|
+
comparator,
|
|
317
457
|
composed,
|
|
318
458
|
computed,
|
|
319
|
-
|
|
320
|
-
effect,
|
|
321
|
-
factory,
|
|
459
|
+
configuration,
|
|
322
460
|
ignore,
|
|
323
|
-
|
|
324
|
-
signal
|
|
461
|
+
reader,
|
|
462
|
+
signal,
|
|
463
|
+
utils_exports as utils,
|
|
464
|
+
writer
|
|
325
465
|
};
|