@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.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
- Collector: () => Collector,
47
- Composed: () => Composed,
48
- Computed: () => Computed,
49
- Signal: () => Signal,
50
- batch: () => batch2,
51
- collector: () => collector2,
52
- composed: () => composed2,
53
- computed: () => computed2,
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 batch2(callback, collector3 = batch2.collector()) {
62
- if (collector3.collecting()) return callback();
63
- collector3.collect(callback).forEach((listener) => listener());
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
- batch2.collector = factory("batch.collector");
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 collector2() {
69
- return new Collector(null);
70
+ function internal_collector() {
71
+ return new internal_collector.Constructor(null);
70
72
  }
71
- var Collector = class {
72
- #values;
73
- constructor(values) {
74
- this.#values = values;
75
- }
76
- collecting() {
77
- return this.#values !== null;
78
- }
79
- add(value) {
80
- if (!this.collecting() || !this.#values) return;
81
- this.#values.add(value);
82
- }
83
- collect(callback) {
84
- const current = this.#values;
85
- this.#values = /* @__PURE__ */ new Set();
86
- callback();
87
- const collected = this.#values;
88
- this.#values = current;
89
- return collected;
90
- }
91
- ignore(callback) {
92
- const current = this.#values;
93
- this.#values = null;
94
- callback();
95
- this.#values = current;
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 computed2(compute, equals) {
101
- return new Computed(
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
- computed2.collector(),
112
+ internal_computed.collector(),
108
113
  compute,
109
114
  equals
110
115
  );
111
116
  }
112
- computed2.collector = factory("computed.collector");
113
- var Computed = class {
114
- #empty;
115
- #value;
116
- #values;
117
- #dependencies;
118
- #compute;
119
- #equals;
120
- #listeners;
121
- #collector;
122
- constructor(empty, value, values, dependencies, listeners, collector3, compute, equals) {
123
- this.#empty = empty;
124
- this.#value = value;
125
- this.#values = values;
126
- this.#dependencies = dependencies;
127
- this.#listeners = listeners;
128
- this.#collector = collector3;
129
- this.#compute = compute;
130
- this.#equals = equals;
131
- }
132
- read() {
133
- this.#collector.add(this);
134
- return this.peek();
135
- }
136
- peek() {
137
- if (!this.#empty && !this.#values.some(([dep, value]) => !dep.equals(value))) return this.#value;
138
- const current = this.#dependencies;
139
- const next = this.#collector.collect(() => this.#value = this.#compute());
140
- this.#dependencies = next;
141
- this.#values = Array.from(next).map((dep) => [dep, dep.read()]);
142
- this.#empty = false;
143
- if (!current.size && !next.size) return this.#value;
144
- if (!this.#listeners.size) return this.#value;
145
- current.forEach((dep) => !next.has(dep) && this.#listeners.forEach((listener) => dep.unsubscribe(listener)));
146
- next.forEach((dep) => !current.has(dep) && this.#listeners.forEach((listener) => dep.subscribe(listener)));
147
- return this.#value;
148
- }
149
- equals(other) {
150
- if (this.#equals) return this.#equals(this.read(), other);
151
- return this.read() === other;
152
- }
153
- subscribe(callback) {
154
- this.#listeners.add(callback);
155
- this.#dependencies.forEach((dep) => dep.subscribe(callback));
156
- return this.unsubscribe.bind(this, callback);
157
- }
158
- unsubscribe(callback) {
159
- this.#listeners.delete(callback);
160
- this.#dependencies.forEach((dep) => dep.unsubscribe(callback));
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 composed2(compute, write, equals) {
166
- return new Composed(
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
- composed2.batcher(),
173
- composed2.collector(),
180
+ internal_composed.batcher(),
181
+ internal_composed.collector(),
174
182
  compute,
175
183
  write,
176
184
  equals
177
185
  );
178
186
  }
179
- composed2.batcher = factory("composed.batcher");
180
- composed2.collector = factory("composed.collector");
181
- var Composed = class extends Computed {
182
- #batcher;
183
- #write;
184
- constructor(empty, value, values, dependencies, listeners, batcher, collector3, compute, write, equals) {
185
- super(empty, value, values, dependencies, listeners, collector3, compute, equals);
186
- this.#batcher = batcher;
187
- this.#write = write;
188
- }
189
- write(value) {
190
- if (this.equals(value)) return;
191
- batch(() => this.#write(value), this.#batcher);
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 effect2(cb) {
207
+ function internal_effect(cb) {
197
208
  let cleanupFn = null;
198
- let dependencies = effect2.collector().collect(() => cleanupFn = cb(true) ?? null);
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 = effect2.collector().collect(() => cleanupFn = cb(false) ?? null);
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
- effect2.collector = factory("effect.collector");
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 ignore2(callback, ...args) {
230
+ function internal_ignore(callback, ...args) {
218
231
  let value;
219
- ignore2.collector().ignore(() => value = typeof callback === "function" ? callback(...args) : callback.read());
232
+ internal_ignore.collector().ignore(() => value = typeof callback === "function" ? callback(...args) : callback.read());
220
233
  return value;
221
234
  }
222
- ignore2.collector = factory("signal.collector");
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 __batcher__ = null;
226
- var __collector__ = null;
227
- var shared = {
228
- batcher() {
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
- collector() {
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 signal2(value, equals) {
240
- return new Signal(value, equals, /* @__PURE__ */ new Set(), signal2.batcher(), signal2.collector());
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
- signal2.batcher = factory("signal.batcher");
243
- signal2.collector = factory("signal.collector");
244
- var Signal = class {
245
- #value;
246
- #equals;
247
- #listeners;
248
- #batcher;
249
- #collector;
250
- constructor(value, equals, listeners, batcher, collector3) {
251
- this.#value = value;
252
- this.#equals = equals;
253
- this.#listeners = listeners;
254
- this.#batcher = batcher;
255
- this.#collector = collector3;
256
- }
257
- read() {
258
- this.#collector.add(this);
259
- return this.peek();
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
- peek() {
262
- return this.#value;
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
- signal2.collector.default(shared.collector);
296
- computed2.collector.default(shared.collector);
297
- composed2.collector.default(shared.collector);
298
- effect2.collector.default(shared.collector);
299
- ignore2.collector.default(shared.collector);
300
- signal2.batcher.default(shared.batcher);
301
- composed2.batcher.default(shared.batcher);
302
- batch2.collector.default(shared.batcher);
303
- collector.default(collector2);
304
- signal.default(signal2);
305
- computed.default(computed2);
306
- composed.default(composed2);
307
- effect.default(effect2);
308
- batch.default(batch2);
309
- ignore.default(ignore2);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@valentin30/signal",
3
- "version": "0.0.8",
3
+ "version": "0.1.0",
4
4
  "description": "My take on signals - lightweight reactive primitives inspired by Preact Signals, written in TypeScript.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",