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