@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.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
- collector: () => collector,
26
+ comparator: () => comparator,
25
27
  composed: () => composed,
26
28
  computed: () => computed,
27
- config: () => config,
28
- effect: () => effect,
29
- factory: () => factory,
29
+ configuration: () => configuration,
30
30
  ignore: () => ignore,
31
- internal: () => internal_exports,
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/factory.ts
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}.factory() not configured!`);
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/core/batch.ts
56
- var batch = factory("batch");
57
-
58
- // src/core/collector.ts
59
- var collector = factory("collector");
60
-
61
- // src/core/composed.ts
62
- var composed = factory("composed");
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
- function internal_batch(callback, collector2 = internal_batch.collector()) {
91
- if (collector2.collecting()) return callback();
92
- collector2.collect(callback).forEach((listener) => listener());
93
- }
94
- ((internal_batch2) => {
95
- internal_batch2.collector = factory("batch.collector");
96
- })(internal_batch || (internal_batch = {}));
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
- function internal_collector() {
100
- return new internal_collector.Constructor(null);
101
- }
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
- }
141
+ var CollectorController = class {
142
+ values;
143
+ constructor(values = null) {
144
+ this.values = values;
129
145
  }
130
- internal_collector2.Constructor = Constructor;
131
- })(internal_collector || (internal_collector = {}));
132
-
133
- // src/internal/computed.ts
134
- function internal_computed(compute, equals) {
135
- return new internal_computed.Constructor(
136
- true,
137
- void 0,
138
- [],
139
- /* @__PURE__ */ new Set(),
140
- /* @__PURE__ */ new Set(),
141
- internal_computed.collector(),
142
- compute,
143
- equals
144
- );
145
- }
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);
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
- unsubscribe(callback) {
194
- this.#listeners.delete(callback);
195
- this.#dependencies.forEach((dep) => dep.unsubscribe(callback));
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
- internal_computed2.Constructor = Constructor;
199
- })(internal_computed || (internal_computed = {}));
178
+ };
200
179
 
201
180
  // src/internal/composed.ts
202
- function internal_composed(compute, write, equals) {
203
- return new internal_composed.Constructor(
204
- true,
205
- void 0,
206
- [],
207
- /* @__PURE__ */ new Set(),
208
- /* @__PURE__ */ new Set(),
209
- internal_composed.batcher(),
210
- internal_composed.collector(),
211
- compute,
212
- write,
213
- equals
214
- );
215
- }
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);
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
- internal_composed2.Constructor = Constructor;
233
- })(internal_composed || (internal_composed = {}));
287
+ };
234
288
 
235
- // src/internal/effect.ts
236
- function internal_effect(cb) {
237
- let cleanupFn = null;
238
- let dependencies = internal_effect.collector().collect(() => cleanupFn = cb(true) ?? null);
239
- dependencies.forEach((dependency) => dependency.subscribe(callback));
240
- function callback() {
241
- if (cleanupFn) cleanupFn(false);
242
- const next = internal_effect.collector().collect(() => cleanupFn = cb(false) ?? null);
243
- next.forEach((dependency) => !dependencies.has(dependency) && dependency.subscribe(callback));
244
- dependencies.forEach((dependency) => !next.has(dependency) && dependency.unsubscribe(callback));
245
- dependencies = next;
246
- }
247
- return () => {
248
- dependencies.forEach((dependency) => dependency.unsubscribe(callback));
249
- dependencies.clear();
250
- if (cleanupFn) cleanupFn(true);
251
- cleanupFn = null;
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
- ((internal_effect2) => {
255
- internal_effect2.collector = factory("effect.collector");
256
- })(internal_effect || (internal_effect = {}));
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/internal/ignore.ts
259
- function internal_ignore(callback, ...args) {
260
- let value;
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/internal/shared.ts
269
- var internal_shared;
270
- ((internal_shared2) => {
271
- let __batcher__ = null;
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/internal/signal.ts
286
- function internal_signal(value, equals) {
287
- return new internal_signal.Constructor(value, equals, /* @__PURE__ */ new Set(), internal_signal.batcher(), internal_signal.collector());
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/config.ts
334
- function config(config2 = {}) {
335
- collector.factory(config2.collector);
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/index.ts
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);
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
- collector,
488
+ comparator,
364
489
  composed,
365
490
  computed,
366
- config,
367
- effect,
368
- factory,
491
+ configuration,
369
492
  ignore,
370
- internal,
371
- signal
493
+ reader,
494
+ signal,
495
+ utils,
496
+ writer
372
497
  });