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