@valentin30/signal 0.0.8 → 0.1.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 +111 -118
- package/dist/index.d.ts +111 -118
- package/dist/index.js +208 -187
- package/dist/index.mjs +208 -187
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -42,9 +42,13 @@ function factory(name) {
|
|
|
42
42
|
if (__default__) return __default__(...args);
|
|
43
43
|
throw new Error(`${name}.factory() not configured!`);
|
|
44
44
|
}
|
|
45
|
-
object.default = (factory2) => __default__ = factory2;
|
|
46
|
-
object.factory = (factory2) => __factory__ = factory2;
|
|
47
45
|
object.configured = () => __default__ !== null || __factory__ !== null;
|
|
46
|
+
object.default = (factory2) => {
|
|
47
|
+
__default__ = factory2 ?? null;
|
|
48
|
+
};
|
|
49
|
+
object.factory = (factory2) => {
|
|
50
|
+
__factory__ = factory2 ?? null;
|
|
51
|
+
};
|
|
48
52
|
return object;
|
|
49
53
|
}
|
|
50
54
|
|
|
@@ -72,163 +76,170 @@ var signal = factory("signal");
|
|
|
72
76
|
// src/internal/index.ts
|
|
73
77
|
var internal_exports = {};
|
|
74
78
|
__export(internal_exports, {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
effect: () => effect2,
|
|
84
|
-
ignore: () => ignore2,
|
|
85
|
-
shared: () => shared,
|
|
86
|
-
signal: () => signal2
|
|
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
87
|
});
|
|
88
88
|
|
|
89
89
|
// src/internal/batch.ts
|
|
90
|
-
function
|
|
91
|
-
if (
|
|
92
|
-
|
|
90
|
+
function internal_batch(callback, collector2 = internal_batch.collector()) {
|
|
91
|
+
if (collector2.collecting()) return callback();
|
|
92
|
+
collector2.collect(callback).forEach((listener) => listener());
|
|
93
93
|
}
|
|
94
|
-
|
|
94
|
+
((internal_batch2) => {
|
|
95
|
+
internal_batch2.collector = factory("batch.collector");
|
|
96
|
+
})(internal_batch || (internal_batch = {}));
|
|
95
97
|
|
|
96
98
|
// src/internal/collector.ts
|
|
97
|
-
function
|
|
98
|
-
return new
|
|
99
|
+
function internal_collector() {
|
|
100
|
+
return new internal_collector.Constructor(null);
|
|
99
101
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
102
|
+
((internal_collector2) => {
|
|
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
|
+
}
|
|
125
129
|
}
|
|
126
|
-
|
|
130
|
+
internal_collector2.Constructor = Constructor;
|
|
131
|
+
})(internal_collector || (internal_collector = {}));
|
|
127
132
|
|
|
128
133
|
// src/internal/computed.ts
|
|
129
|
-
function
|
|
130
|
-
return new
|
|
134
|
+
function internal_computed(compute, equals) {
|
|
135
|
+
return new internal_computed.Constructor(
|
|
131
136
|
true,
|
|
132
137
|
void 0,
|
|
133
138
|
[],
|
|
134
139
|
/* @__PURE__ */ new Set(),
|
|
135
140
|
/* @__PURE__ */ new Set(),
|
|
136
|
-
|
|
141
|
+
internal_computed.collector(),
|
|
137
142
|
compute,
|
|
138
143
|
equals
|
|
139
144
|
);
|
|
140
145
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
146
|
+
((internal_computed2) => {
|
|
147
|
+
internal_computed2.collector = factory("computed.collector");
|
|
148
|
+
class Constructor {
|
|
149
|
+
#empty;
|
|
150
|
+
#value;
|
|
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);
|
|
192
|
+
}
|
|
193
|
+
unsubscribe(callback) {
|
|
194
|
+
this.#listeners.delete(callback);
|
|
195
|
+
this.#dependencies.forEach((dep) => dep.unsubscribe(callback));
|
|
196
|
+
}
|
|
190
197
|
}
|
|
191
|
-
|
|
198
|
+
internal_computed2.Constructor = Constructor;
|
|
199
|
+
})(internal_computed || (internal_computed = {}));
|
|
192
200
|
|
|
193
201
|
// src/internal/composed.ts
|
|
194
|
-
function
|
|
195
|
-
return new
|
|
202
|
+
function internal_composed(compute, write, equals) {
|
|
203
|
+
return new internal_composed.Constructor(
|
|
196
204
|
true,
|
|
197
205
|
void 0,
|
|
198
206
|
[],
|
|
199
207
|
/* @__PURE__ */ new Set(),
|
|
200
208
|
/* @__PURE__ */ new Set(),
|
|
201
|
-
|
|
202
|
-
|
|
209
|
+
internal_composed.batcher(),
|
|
210
|
+
internal_composed.collector(),
|
|
203
211
|
compute,
|
|
204
212
|
write,
|
|
205
213
|
equals
|
|
206
214
|
);
|
|
207
215
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
216
|
+
((internal_composed2) => {
|
|
217
|
+
internal_composed2.batcher = factory("composed.batcher");
|
|
218
|
+
internal_composed2.collector = factory("composed.collector");
|
|
219
|
+
class Constructor extends internal_computed.Constructor {
|
|
220
|
+
#batcher;
|
|
221
|
+
#write;
|
|
222
|
+
constructor(empty, value, values, dependencies, listeners, batcher2, collector3, compute, write, equals) {
|
|
223
|
+
super(empty, value, values, dependencies, listeners, collector3, compute, equals);
|
|
224
|
+
this.#batcher = batcher2;
|
|
225
|
+
this.#write = write;
|
|
226
|
+
}
|
|
227
|
+
write(value) {
|
|
228
|
+
if (this.equals(value)) return;
|
|
229
|
+
batch(() => this.#write(value), this.#batcher);
|
|
230
|
+
}
|
|
221
231
|
}
|
|
222
|
-
|
|
232
|
+
internal_composed2.Constructor = Constructor;
|
|
233
|
+
})(internal_composed || (internal_composed = {}));
|
|
223
234
|
|
|
224
235
|
// src/internal/effect.ts
|
|
225
|
-
function
|
|
236
|
+
function internal_effect(cb) {
|
|
226
237
|
let cleanupFn = null;
|
|
227
|
-
let dependencies =
|
|
238
|
+
let dependencies = internal_effect.collector().collect(() => cleanupFn = cb(true) ?? null);
|
|
228
239
|
dependencies.forEach((dependency) => dependency.subscribe(callback));
|
|
229
240
|
function callback() {
|
|
230
241
|
if (cleanupFn) cleanupFn(false);
|
|
231
|
-
const next =
|
|
242
|
+
const next = internal_effect.collector().collect(() => cleanupFn = cb(false) ?? null);
|
|
232
243
|
next.forEach((dependency) => !dependencies.has(dependency) && dependency.subscribe(callback));
|
|
233
244
|
dependencies.forEach((dependency) => !next.has(dependency) && dependency.unsubscribe(callback));
|
|
234
245
|
dependencies = next;
|
|
@@ -240,74 +251,84 @@ function effect2(cb) {
|
|
|
240
251
|
cleanupFn = null;
|
|
241
252
|
};
|
|
242
253
|
}
|
|
243
|
-
|
|
254
|
+
((internal_effect2) => {
|
|
255
|
+
internal_effect2.collector = factory("effect.collector");
|
|
256
|
+
})(internal_effect || (internal_effect = {}));
|
|
244
257
|
|
|
245
258
|
// src/internal/ignore.ts
|
|
246
|
-
function
|
|
259
|
+
function internal_ignore(callback, ...args) {
|
|
247
260
|
let value;
|
|
248
|
-
|
|
261
|
+
internal_ignore.collector().ignore(() => value = typeof callback === "function" ? callback(...args) : callback.read());
|
|
249
262
|
return value;
|
|
250
263
|
}
|
|
251
|
-
|
|
264
|
+
((internal_ignore2) => {
|
|
265
|
+
internal_ignore2.collector = factory("signal.collector");
|
|
266
|
+
})(internal_ignore || (internal_ignore = {}));
|
|
252
267
|
|
|
253
268
|
// src/internal/shared.ts
|
|
254
|
-
var
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
269
|
+
var internal_shared;
|
|
270
|
+
((internal_shared2) => {
|
|
271
|
+
let __batcher__ = null;
|
|
272
|
+
let __collector__ = null;
|
|
273
|
+
function batcher() {
|
|
258
274
|
if (!__batcher__) __batcher__ = collector();
|
|
259
275
|
return __batcher__;
|
|
260
|
-
}
|
|
261
|
-
|
|
276
|
+
}
|
|
277
|
+
internal_shared2.batcher = batcher;
|
|
278
|
+
function collector2() {
|
|
262
279
|
if (!__collector__) __collector__ = collector();
|
|
263
280
|
return __collector__;
|
|
264
281
|
}
|
|
265
|
-
|
|
282
|
+
internal_shared2.collector = collector2;
|
|
283
|
+
})(internal_shared || (internal_shared = {}));
|
|
266
284
|
|
|
267
285
|
// src/internal/signal.ts
|
|
268
|
-
function
|
|
269
|
-
return new
|
|
286
|
+
function internal_signal(value, equals) {
|
|
287
|
+
return new internal_signal.Constructor(value, equals, /* @__PURE__ */ new Set(), internal_signal.batcher(), internal_signal.collector());
|
|
270
288
|
}
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
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
|
+
}
|
|
289
329
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
}
|
|
293
|
-
write(value) {
|
|
294
|
-
if (this.equals(value)) return;
|
|
295
|
-
this.#value = value;
|
|
296
|
-
if (this.#batcher.collecting()) this.#listeners.forEach((listener) => this.#batcher.add(listener));
|
|
297
|
-
else this.#listeners.forEach((listener) => listener());
|
|
298
|
-
}
|
|
299
|
-
equals(other) {
|
|
300
|
-
if (this.#equals) return this.#equals(this.#value, other);
|
|
301
|
-
return this.#value === other;
|
|
302
|
-
}
|
|
303
|
-
subscribe(callback) {
|
|
304
|
-
this.#listeners.add(callback);
|
|
305
|
-
return this.unsubscribe.bind(this, callback);
|
|
306
|
-
}
|
|
307
|
-
unsubscribe(callback) {
|
|
308
|
-
this.#listeners.delete(callback);
|
|
309
|
-
}
|
|
310
|
-
};
|
|
330
|
+
internal_signal2.Constructor = Constructor;
|
|
331
|
+
})(internal_signal || (internal_signal = {}));
|
|
311
332
|
|
|
312
333
|
// src/core/config.ts
|
|
313
334
|
function config(config2 = {}) {
|
|
@@ -321,21 +342,21 @@ function config(config2 = {}) {
|
|
|
321
342
|
}
|
|
322
343
|
|
|
323
344
|
// src/index.ts
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
collector.default(
|
|
333
|
-
signal.default(
|
|
334
|
-
computed.default(
|
|
335
|
-
composed.default(
|
|
336
|
-
effect.default(
|
|
337
|
-
batch.default(
|
|
338
|
-
ignore.default(
|
|
345
|
+
internal_signal.collector.default(internal_shared.collector);
|
|
346
|
+
internal_computed.collector.default(internal_shared.collector);
|
|
347
|
+
internal_composed.collector.default(internal_shared.collector);
|
|
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);
|
|
339
360
|
// Annotate the CommonJS export names for ESM import in node:
|
|
340
361
|
0 && (module.exports = {
|
|
341
362
|
batch,
|