@solidjs/signals 0.7.5 → 0.8.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/prod.js CHANGED
@@ -1,8 +1,8 @@
1
1
  // src/core/error.ts
2
2
  var NotReadyError = class extends Error {
3
- constructor(node) {
3
+ constructor(cause) {
4
4
  super();
5
- this.cause = node;
5
+ this.cause = cause;
6
6
  }
7
7
  };
8
8
  var NoOwnerError = class extends Error {
@@ -19,944 +19,904 @@ var ContextNotFoundError = class extends Error {
19
19
  };
20
20
 
21
21
  // src/core/constants.ts
22
- var STATE_CLEAN = 0;
23
- var STATE_CHECK = 1;
24
- var STATE_DIRTY = 2;
25
- var STATE_DISPOSED = 3;
26
- var EFFECT_PURE = 0;
27
- var EFFECT_RENDER = 1;
28
- var EFFECT_USER = 2;
22
+ var NOT_PENDING = {};
29
23
  var SUPPORTS_PROXY = typeof Proxy === "function";
30
24
 
31
- // src/core/flags.ts
32
- var ERROR_OFFSET = 0;
33
- var ERROR_BIT = 1 << ERROR_OFFSET;
34
- var LOADING_OFFSET = 1;
35
- var LOADING_BIT = 1 << LOADING_OFFSET;
36
- var UNINITIALIZED_OFFSET = 2;
37
- var UNINITIALIZED_BIT = 1 << UNINITIALIZED_OFFSET;
38
- var DEFAULT_FLAGS = ERROR_BIT;
25
+ // src/core/heap.ts
26
+ function actualInsertIntoHeap(n, heap) {
27
+ const parentHeight = (n.s?.Z ? n.s._?.e : n.s?.e) ?? -1;
28
+ if (parentHeight >= n.e)
29
+ n.e = parentHeight + 1;
30
+ const height = n.e;
31
+ const heapAtHeight = heap.o[height];
32
+ if (heapAtHeight === void 0) {
33
+ heap.o[height] = n;
34
+ } else {
35
+ const tail = heapAtHeight.x;
36
+ tail.O = n;
37
+ n.x = tail;
38
+ heapAtHeight.x = n;
39
+ }
40
+ if (height > heap.J) {
41
+ heap.J = height;
42
+ }
43
+ }
44
+ function insertIntoHeap(n, heap) {
45
+ let flags = n.b;
46
+ if (flags & (8 /* InHeap */ | 4 /* RecomputingDeps */))
47
+ return;
48
+ if (flags & 1 /* Check */) {
49
+ n.b = flags & ~(1 /* Check */ | 2 /* Dirty */) | 2 /* Dirty */ | 8 /* InHeap */;
50
+ } else
51
+ n.b = flags | 8 /* InHeap */;
52
+ if (!(flags & 16 /* InHeapHeight */)) {
53
+ actualInsertIntoHeap(n, heap);
54
+ }
55
+ }
56
+ function insertIntoHeapHeight(n, heap) {
57
+ let flags = n.b;
58
+ if (flags & (8 /* InHeap */ | 4 /* RecomputingDeps */ | 16 /* InHeapHeight */))
59
+ return;
60
+ n.b = flags | 16 /* InHeapHeight */;
61
+ actualInsertIntoHeap(n, heap);
62
+ }
63
+ function deleteFromHeap(n, heap) {
64
+ const flags = n.b;
65
+ if (!(flags & (8 /* InHeap */ | 16 /* InHeapHeight */)))
66
+ return;
67
+ n.b = flags & ~(8 /* InHeap */ | 16 /* InHeapHeight */);
68
+ const height = n.e;
69
+ if (n.x === n) {
70
+ heap.o[height] = void 0;
71
+ } else {
72
+ const next = n.O;
73
+ const dhh = heap.o[height];
74
+ const end = next ?? dhh;
75
+ if (n === dhh) {
76
+ heap.o[height] = next;
77
+ } else {
78
+ n.x.O = next;
79
+ }
80
+ end.x = n.x;
81
+ }
82
+ n.x = n;
83
+ n.O = void 0;
84
+ }
85
+ function markHeap(heap) {
86
+ if (heap.$)
87
+ return;
88
+ heap.$ = true;
89
+ for (let i = 0; i <= heap.J; i++) {
90
+ for (let el = heap.o[i]; el !== void 0; el = el.O) {
91
+ if (el.b & 8 /* InHeap */)
92
+ markNode(el);
93
+ }
94
+ }
95
+ }
96
+ function markNode(el, newState = 2 /* Dirty */) {
97
+ const flags = el.b;
98
+ if ((flags & (1 /* Check */ | 2 /* Dirty */)) >= newState)
99
+ return;
100
+ el.b = flags & ~(1 /* Check */ | 2 /* Dirty */) | newState;
101
+ for (let link2 = el.p; link2 !== null; link2 = link2.y) {
102
+ markNode(link2.m, 1 /* Check */);
103
+ }
104
+ if (el.aa !== null) {
105
+ for (let child = el.aa; child !== null; child = child.qa) {
106
+ for (let link2 = child.p; link2 !== null; link2 = link2.y) {
107
+ markNode(link2.m, 1 /* Check */);
108
+ }
109
+ }
110
+ }
111
+ }
112
+ function runHeap(heap, recompute2) {
113
+ heap.$ = false;
114
+ for (heap.t = 0; heap.t <= heap.J; heap.t++) {
115
+ let el = heap.o[heap.t];
116
+ while (el !== void 0) {
117
+ if (el.b & 8 /* InHeap */)
118
+ recompute2(el);
119
+ else {
120
+ adjustHeight(el, heap);
121
+ }
122
+ el = heap.o[heap.t];
123
+ }
124
+ }
125
+ heap.J = 0;
126
+ }
127
+ function adjustHeight(el, heap) {
128
+ deleteFromHeap(el, heap);
129
+ let newHeight = el.e;
130
+ for (let d = el.u; d; d = d.E) {
131
+ const dep1 = d.P;
132
+ const dep = "_owner" in dep1 ? dep1.z : dep1;
133
+ if ("_fn" in dep) {
134
+ if (dep.e >= newHeight) {
135
+ newHeight = dep.e + 1;
136
+ }
137
+ }
138
+ }
139
+ if (el.e !== newHeight) {
140
+ el.e = newHeight;
141
+ for (let s = el.p; s !== null; s = s.y) {
142
+ insertIntoHeapHeight(s.m, heap);
143
+ }
144
+ }
145
+ }
39
146
 
40
147
  // src/core/scheduler.ts
41
148
  var clock = 0;
42
- function incrementClock() {
43
- clock++;
44
- }
45
- var ActiveTransition = null;
46
- var Unobserved = [];
149
+ var activeTransition = null;
150
+ var unobserved = [];
151
+ var transitions = /* @__PURE__ */ new Set();
47
152
  var scheduled = false;
48
153
  function schedule() {
49
154
  if (scheduled)
50
155
  return;
51
156
  scheduled = true;
52
- if (!globalQueue.C)
157
+ if (!globalQueue.ba)
53
158
  queueMicrotask(flush);
54
159
  }
55
- function notifyUnobserved() {
56
- for (let i = 0; i < Unobserved.length; i++) {
57
- const source = Unobserved[i];
58
- if (!source.c || !source.c.length)
59
- Unobserved[i].fa?.();
60
- }
61
- Unobserved = [];
62
- }
63
- var pureQueue = [];
160
+ var dirtyQueue = {
161
+ o: new Array(2e3).fill(void 0),
162
+ $: false,
163
+ t: 0,
164
+ J: 0
165
+ };
166
+ var zombieQueue = {
167
+ o: new Array(2e3).fill(void 0),
168
+ $: false,
169
+ t: 0,
170
+ J: 0
171
+ };
64
172
  var Queue = class {
65
- l = null;
66
- C = false;
67
- h = [[], []];
68
- i = [];
173
+ s = null;
174
+ A = [[], []];
175
+ Q = [];
69
176
  created = clock;
70
- enqueue(type, fn) {
71
- pureQueue.push(fn);
72
- if (type)
73
- this.h[type - 1].push(fn);
74
- schedule();
177
+ addChild(child) {
178
+ this.Q.push(child);
179
+ child.s = this;
180
+ }
181
+ removeChild(child) {
182
+ const index = this.Q.indexOf(child);
183
+ if (index >= 0) {
184
+ this.Q.splice(index, 1);
185
+ child.s = null;
186
+ }
187
+ }
188
+ notify(node, mask, flags) {
189
+ if (this.s)
190
+ return this.s.notify(node, mask, flags);
191
+ return false;
75
192
  }
76
193
  run(type) {
77
- if (type === EFFECT_PURE) {
78
- pureQueue.length && runQueue(pureQueue, type);
79
- pureQueue = [];
80
- return;
81
- } else if (this.h[type - 1].length) {
82
- const effects = this.h[type - 1];
83
- this.h[type - 1] = [];
194
+ if (this.A[type - 1].length) {
195
+ const effects = this.A[type - 1];
196
+ this.A[type - 1] = [];
84
197
  runQueue(effects, type);
85
198
  }
86
- for (let i = 0; i < this.i.length; i++) {
87
- this.i[i].run(type);
199
+ for (let i = 0; i < this.Q.length; i++) {
200
+ this.Q[i].run(type);
88
201
  }
89
202
  }
203
+ enqueue(type, fn) {
204
+ if (type)
205
+ this.A[type - 1].push(fn);
206
+ schedule();
207
+ }
208
+ };
209
+ var GlobalQueue = class _GlobalQueue extends Queue {
210
+ ba = false;
211
+ h = [];
212
+ static R;
213
+ static ka;
90
214
  flush() {
91
- if (this.C)
215
+ if (this.ba)
92
216
  return;
93
- this.C = true;
217
+ this.ba = true;
94
218
  try {
95
- this.run(EFFECT_PURE);
96
- incrementClock();
219
+ runHeap(dirtyQueue, _GlobalQueue.R);
220
+ if (activeTransition) {
221
+ if (!transitionComplete(activeTransition)) {
222
+ runHeap(zombieQueue, _GlobalQueue.R);
223
+ globalQueue.h = [];
224
+ activeTransition.queues[0].push(...globalQueue.A[0]);
225
+ activeTransition.queues[1].push(...globalQueue.A[1]);
226
+ globalQueue.A = [[], []];
227
+ clock++;
228
+ scheduled = false;
229
+ runPending(activeTransition.pendingNodes, true);
230
+ activeTransition = null;
231
+ return;
232
+ }
233
+ globalQueue.h.push(...activeTransition.pendingNodes);
234
+ globalQueue.A[0].push(...activeTransition.queues[0]);
235
+ globalQueue.A[1].push(...activeTransition.queues[1]);
236
+ transitions.delete(activeTransition);
237
+ activeTransition = null;
238
+ if (runPending(globalQueue.h, false))
239
+ runHeap(dirtyQueue, _GlobalQueue.R);
240
+ } else if (transitions.size)
241
+ runHeap(zombieQueue, _GlobalQueue.R);
242
+ for (let i = 0; i < globalQueue.h.length; i++) {
243
+ const n = globalQueue.h[i];
244
+ if (n.d !== NOT_PENDING) {
245
+ n.g = n.d;
246
+ n.d = NOT_PENDING;
247
+ }
248
+ if (n.ha)
249
+ _GlobalQueue.ka(n, false, true);
250
+ }
251
+ globalQueue.h.length = 0;
252
+ clock++;
97
253
  scheduled = false;
98
- this.run(EFFECT_RENDER);
99
- this.run(EFFECT_USER);
254
+ this.run(1 /* Render */);
255
+ this.run(2 /* User */);
100
256
  } finally {
101
- this.C = false;
102
- Unobserved.length && notifyUnobserved();
257
+ this.ba = false;
258
+ unobserved.length && notifyUnobserved();
103
259
  }
104
260
  }
105
- addChild(child) {
106
- if (ActiveTransition && ActiveTransition.J.has(this))
107
- return ActiveTransition.J.get(this).addChild(child);
108
- this.i.push(child);
109
- child.l = this;
110
- }
111
- removeChild(child) {
112
- if (ActiveTransition && ActiveTransition.J.has(this))
113
- return ActiveTransition.J.get(this).removeChild(child);
114
- const index = this.i.indexOf(child);
115
- if (index >= 0) {
116
- this.i.splice(index, 1);
117
- child.l = null;
261
+ notify(node, mask, flags) {
262
+ if (mask & 1 /* Pending */) {
263
+ if (flags & 1 /* Pending */) {
264
+ if (activeTransition && !activeTransition.asyncNodes.includes(node.B.cause))
265
+ activeTransition.asyncNodes.push(node.B.cause);
266
+ }
267
+ return true;
118
268
  }
119
- }
120
- notify(...args) {
121
- if (this.l)
122
- return this.l.notify(...args);
123
269
  return false;
124
270
  }
125
- merge(queue) {
126
- this.h[0].push.apply(this.h[0], queue.h[0]);
127
- this.h[1].push.apply(this.h[1], queue.h[1]);
128
- for (let i = 0; i < queue.i.length; i++) {
129
- const og = this.i.find((c) => c.d === queue.i[i].d);
130
- if (og)
131
- og.merge(queue.i[i]);
132
- else
133
- this.addChild(queue.i[i]);
271
+ initTransition(node) {
272
+ if (activeTransition && activeTransition.time === clock)
273
+ return;
274
+ if (!activeTransition) {
275
+ activeTransition = node.S ?? {
276
+ time: clock,
277
+ pendingNodes: [],
278
+ asyncNodes: [],
279
+ queues: [[], []]
280
+ };
134
281
  }
282
+ transitions.add(activeTransition);
283
+ activeTransition.time = clock;
284
+ for (let i = 0; i < globalQueue.h.length; i++) {
285
+ const n = globalQueue.h[i];
286
+ n.S = activeTransition;
287
+ activeTransition.pendingNodes.push(n);
288
+ }
289
+ globalQueue.h = activeTransition.pendingNodes;
135
290
  }
136
291
  };
137
- var globalQueue = new Queue();
292
+ function runPending(pendingNodes, value) {
293
+ let needsReset = false;
294
+ const p = pendingNodes.slice();
295
+ for (let i = 0; i < p.length; i++) {
296
+ const n = p[i];
297
+ n.S = activeTransition;
298
+ if (n.G) {
299
+ n.G.ca(value);
300
+ needsReset = true;
301
+ }
302
+ }
303
+ return needsReset;
304
+ }
305
+ var globalQueue = new GlobalQueue();
138
306
  function flush() {
139
307
  while (scheduled) {
140
308
  globalQueue.flush();
141
309
  }
142
310
  }
143
- function removeSourceObservers(node, index) {
144
- let source;
145
- let swap;
146
- for (let i = index; i < node.b.length; i++) {
147
- source = getTransitionSource(node.b[i]);
148
- if (source.c) {
149
- if ((swap = source.c.indexOf(node)) !== -1) {
150
- source.c[swap] = source.c[source.c.length - 1];
151
- source.c.pop();
152
- }
153
- if (!source.c.length)
154
- Unobserved.push(source);
155
- }
156
- }
157
- }
158
311
  function runQueue(queue, type) {
159
312
  for (let i = 0; i < queue.length; i++)
160
313
  queue[i](type);
161
314
  }
162
- var Transition = class _Transition {
163
- b = /* @__PURE__ */ new Map();
164
- t = /* @__PURE__ */ new Set();
165
- K = /* @__PURE__ */ new Set();
166
- j = /* @__PURE__ */ new Set();
167
- D = false;
168
- h = [[], []];
169
- J = /* @__PURE__ */ new Map();
170
- G = [];
171
- i = [];
172
- l = null;
173
- C = false;
174
- Y = false;
175
- d = globalQueue;
176
- aa;
177
- created = clock;
178
- constructor(signal) {
179
- this.aa = signal;
180
- this.J.set(globalQueue, this);
181
- for (const child of globalQueue.i) {
182
- cloneQueue(child, this, this);
315
+ function transitionComplete(transition) {
316
+ let done = true;
317
+ for (let i = 0; i < transition.asyncNodes.length; i++) {
318
+ if (transition.asyncNodes[i].f & 1 /* Pending */) {
319
+ done = false;
320
+ break;
183
321
  }
184
322
  }
185
- enqueue(type, fn) {
186
- this.G.push(fn);
187
- if (type)
188
- this.h[type - 1].push(fn);
189
- this.schedule();
190
- }
191
- run(type) {
192
- if (type === EFFECT_PURE) {
193
- this.G.length && runQueue(this.G, type);
194
- this.G = [];
195
- return;
196
- } else if (this.h[type - 1].length) {
197
- const effects = this.h[type - 1];
198
- this.h[type - 1] = [];
199
- runQueue(effects, type);
200
- }
201
- for (let i = 0; i < this.i.length; i++) {
202
- this.i[i].run(type);
203
- }
323
+ return done;
324
+ }
325
+ function notifyUnobserved() {
326
+ for (let i = 0; i < unobserved.length; i++) {
327
+ const source = unobserved[i];
328
+ if (!source.p)
329
+ unobserved[i].ra?.();
204
330
  }
205
- flush() {
206
- if (this.C || this.D)
207
- return;
208
- globalQueue.flush();
209
- this.C = true;
210
- let currentTransition = ActiveTransition;
211
- ActiveTransition = this;
212
- try {
213
- this.run(EFFECT_PURE);
214
- incrementClock();
215
- this.Y = false;
216
- ActiveTransition = currentTransition;
217
- finishTransition(this);
218
- } finally {
219
- this.C = false;
220
- ActiveTransition = currentTransition;
331
+ unobserved = [];
332
+ }
333
+
334
+ // src/core/core.ts
335
+ GlobalQueue.R = recompute;
336
+ GlobalQueue.ka = disposeChildren;
337
+ var tracking = false;
338
+ var stale = false;
339
+ var pendingValueCheck = false;
340
+ var pendingCheck = null;
341
+ var context = null;
342
+ var defaultContext = {};
343
+ function recompute(el, create = false) {
344
+ deleteFromHeap(el, el.b & 32 /* Zombie */ ? zombieQueue : dirtyQueue);
345
+ if (el.d !== NOT_PENDING || el.T || el.U)
346
+ disposeChildren(el);
347
+ else {
348
+ markDisposal(el);
349
+ globalQueue.h.push(el);
350
+ el.U = el.q;
351
+ el.T = el.n;
352
+ el.q = null;
353
+ el.n = null;
354
+ }
355
+ const oldcontext = context;
356
+ context = el;
357
+ el.H = null;
358
+ el.b = 4 /* RecomputingDeps */;
359
+ el.V = clock;
360
+ let value = el.d === NOT_PENDING ? el.g : el.d;
361
+ let oldHeight = el.e;
362
+ let prevStatusFlags = el.f;
363
+ let prevError = el.B;
364
+ let prevTracking = tracking;
365
+ clearStatusFlags(el);
366
+ tracking = true;
367
+ try {
368
+ value = el.ha(value);
369
+ } catch (e) {
370
+ if (e instanceof NotReadyError) {
371
+ if (e.cause !== el)
372
+ link(e.cause, el);
373
+ setStatusFlags(el, prevStatusFlags & ~2 /* Error */ | 1 /* Pending */, e);
374
+ } else {
375
+ setError(el, e);
221
376
  }
377
+ } finally {
378
+ tracking = prevTracking;
222
379
  }
223
- addChild(child) {
224
- this.i.push(child);
225
- child.l = this;
226
- }
227
- removeChild(child) {
228
- const index = this.i.indexOf(child);
229
- if (index >= 0)
230
- this.i.splice(index, 1);
231
- }
232
- notify(node, type, flags) {
233
- if (!(type & LOADING_BIT))
234
- return false;
235
- if (flags & LOADING_BIT) {
236
- this.t.add(node);
380
+ el.b = 0 /* None */;
381
+ context = oldcontext;
382
+ const depsTail = el.H;
383
+ let toRemove = depsTail !== null ? depsTail.E : el.u;
384
+ if (toRemove !== null) {
385
+ do {
386
+ toRemove = unlinkSubs(toRemove);
387
+ } while (toRemove !== null);
388
+ if (depsTail !== null) {
389
+ depsTail.E = null;
237
390
  } else {
238
- this.t.delete(node);
391
+ el.u = null;
239
392
  }
240
- return true;
241
393
  }
242
- merge(queue) {
243
- this.h[0].push.apply(this.h[0], queue.h[0]);
244
- this.h[1].push.apply(this.h[1], queue.h[1]);
245
- this.G.push.apply(this.G, queue.G);
246
- queue.h[0].length = 0;
247
- queue.h[1].length = 0;
248
- queue.G.length = 0;
249
- for (let i = 0; i < queue.i.length; i++) {
250
- const og = this.i.find((c) => c.d === queue.i[i].d);
251
- if (og)
252
- og.merge(queue.i[i]);
253
- else
254
- this.addChild(queue.i[i]);
255
- }
256
- }
257
- schedule() {
258
- if (this.Y)
259
- return;
260
- this.Y = true;
261
- if (!this.C)
262
- queueMicrotask(() => this.flush());
263
- }
264
- runTransition(fn, force = false) {
265
- if (this.D) {
266
- if (this.D instanceof _Transition)
267
- return this.D.runTransition(fn, force);
268
- if (!force)
269
- throw new Error("Transition already completed");
270
- fn();
271
- return;
272
- }
273
- ActiveTransition = this;
274
- try {
275
- let result = fn();
276
- let transition2 = ActiveTransition;
277
- if (result?.next) {
278
- (async function() {
279
- let temp, value;
280
- while (!(temp = result.next(value)).done) {
281
- transition2 = ActiveTransition;
282
- if (temp.value instanceof Promise) {
283
- transition2.K.add(temp.value);
284
- try {
285
- value = await temp.value;
286
- } finally {
287
- transition2 = latestTransition(transition2);
288
- transition2.K.delete(temp.value);
289
- }
290
- ActiveTransition = transition2;
291
- } else
292
- value = temp.value;
293
- }
294
- ActiveTransition = null;
295
- finishTransition(transition2);
296
- })();
297
- }
298
- if (result instanceof Promise) {
299
- transition2.K.add(result);
300
- result.finally(() => {
301
- transition2 = latestTransition(transition2);
302
- transition2.K.delete(result);
303
- ActiveTransition = null;
304
- finishTransition(transition2);
305
- });
394
+ const valueChanged = !el.da || !el.da(el.d === NOT_PENDING ? el.g : el.d, value);
395
+ const statusFlagsChanged = el.f !== prevStatusFlags || el.B !== prevError;
396
+ el.la?.(statusFlagsChanged, prevStatusFlags);
397
+ if (valueChanged || statusFlagsChanged) {
398
+ if (valueChanged) {
399
+ if (create || el.ia || el.I)
400
+ el.g = value;
401
+ else {
402
+ if (el.d === NOT_PENDING)
403
+ globalQueue.h.push(el);
404
+ el.d = value;
306
405
  }
307
- } finally {
308
- const transition2 = ActiveTransition;
309
- ActiveTransition = null;
310
- finishTransition(transition2);
406
+ if (el.C)
407
+ el.C.ca(value);
311
408
  }
312
- }
313
- addOptimistic(fn) {
314
- if (fn.f && fn.f !== this) {
315
- mergeTransitions(fn.f, this);
316
- ActiveTransition = fn.f;
317
- return;
409
+ for (let s = el.p; s !== null; s = s.y) {
410
+ const queue = s.m.b & 32 /* Zombie */ ? zombieQueue : dirtyQueue;
411
+ if (s.m.e < el.e && queue.t > s.m.e)
412
+ queue.t = s.m.e;
413
+ insertIntoHeap(s.m, queue);
318
414
  }
319
- fn.f = this;
320
- this.j.add(fn);
321
- }
322
- };
323
- function cloneGraph(node) {
324
- if (node.j) {
325
- if (node.a !== STATE_DISPOSED) {
326
- !node.f && node.j.ia?.();
327
- ActiveTransition.addOptimistic(node.j);
415
+ } else if (el.e != oldHeight) {
416
+ for (let s = el.p; s !== null; s = s.y) {
417
+ insertIntoHeapHeight(s.m, s.m.b & 32 /* Zombie */ ? zombieQueue : dirtyQueue);
328
418
  }
329
- return node;
330
419
  }
331
- if (node.f) {
332
- if (node.f !== ActiveTransition) {
333
- mergeTransitions(node.f, ActiveTransition);
334
- ActiveTransition = node.f;
335
- }
336
- return node.f.b.get(node);
337
- }
338
- const clone = Object.create(Object.getPrototypeOf(node));
339
- Object.assign(clone, node, {
340
- o: null,
341
- n: null,
342
- c: null,
343
- b: node.b ? [...node.b] : null,
344
- d: node
345
- });
346
- delete clone.T;
347
- ActiveTransition.b.set(node, clone);
348
- node.f = ActiveTransition;
349
- if (node.b) {
350
- for (let i = 0; i < node.b.length; i++)
351
- node.b[i].c.push(clone);
352
- }
353
- if (node.c) {
354
- clone.c = [];
355
- for (let i = 0, length = node.c.length; i < length; i++) {
356
- !node.c[i].d && clone.c.push(cloneGraph(node.c[i]));
357
- }
358
- }
359
- return clone;
360
- }
361
- function latestTransition(t) {
362
- while (t.D instanceof Transition)
363
- t = t.D;
364
- return t;
365
- }
366
- function replaceSourceObservers(node, transition2) {
367
- let source;
368
- let transitionSource;
369
- let swap;
370
- for (let i = 0; i < node.b.length; i++) {
371
- transitionSource = transition2.b.get(node.b[i]);
372
- source = transitionSource || node.b[i];
373
- if (source.c && (swap = source.c.indexOf(node)) !== -1) {
374
- source.c[swap] = transitionSource ? node.d : source.c[source.c.length - 1];
375
- !transitionSource && source.c.pop();
376
- }
377
- }
378
- }
379
- function cloneQueue(queue, parent, transition2) {
380
- const clone = Object.create(Object.getPrototypeOf(queue));
381
- Object.assign(clone, queue, {
382
- d: queue,
383
- l: parent,
384
- i: [],
385
- enqueue(type, fn) {
386
- transition2 = latestTransition(transition2);
387
- transition2.enqueue(type, fn);
388
- },
389
- notify(node, type, flags) {
390
- node = node.d || node;
391
- if (!clone.L || type & LOADING_BIT) {
392
- type &= ~LOADING_BIT;
393
- transition2 = latestTransition(transition2);
394
- transition2.notify(node, LOADING_BIT, flags);
395
- if (!type)
396
- return true;
420
+ }
421
+ function updateIfNecessary(el) {
422
+ if (el.b & 1 /* Check */) {
423
+ for (let d = el.u; d; d = d.E) {
424
+ const dep1 = d.P;
425
+ const dep = "_owner" in dep1 ? dep1.z : dep1;
426
+ if ("_fn" in dep) {
427
+ updateIfNecessary(dep);
428
+ }
429
+ if (el.b & 2 /* Dirty */) {
430
+ break;
397
431
  }
398
- return queue.notify.call(this, node, type, flags);
399
- }
400
- });
401
- parent.i.push(clone);
402
- transition2.J.set(queue, clone);
403
- for (const child of queue.i) {
404
- cloneQueue(child, clone, transition2);
405
- }
406
- }
407
- function resolveQueues(children) {
408
- for (const child of children) {
409
- const og = child.d;
410
- if (og) {
411
- const clonedChildren = child.i;
412
- delete child.enqueue;
413
- delete child.notify;
414
- delete child.l;
415
- delete child.i;
416
- Object.assign(og, child);
417
- delete og.d;
418
- resolveQueues(clonedChildren);
419
- } else if (child.l.d) {
420
- child.l.d.addChild(child);
421
- }
422
- }
423
- }
424
- function mergeTransitions(t1, t2) {
425
- t2.b.forEach((value, key) => {
426
- key.f = t1;
427
- t1.b.set(key, value);
428
- });
429
- t2.j.forEach((c) => {
430
- c.f = t1;
431
- t1.j.add(c);
432
- });
433
- t2.K.forEach((p) => t1.K.add(p));
434
- t2.t.forEach((n) => t1.t.add(n));
435
- t1.merge(t2);
436
- t2.D = t1;
437
- }
438
- function getTransitionSource(input) {
439
- return ActiveTransition && ActiveTransition.b.get(input) || input;
440
- }
441
- function getQueue(node) {
442
- const transition2 = ActiveTransition || node.d?.f;
443
- return transition2 && transition2.J.get(node.E) || node.E;
444
- }
445
- function initialDispose(node) {
446
- let current = node.n;
447
- while (current !== null && current.l === node) {
448
- initialDispose(current);
449
- const clone = ActiveTransition.b.get(current);
450
- if (clone && !clone.Z)
451
- clone.dispose(true);
452
- current = current.n;
453
- }
454
- }
455
- function finishTransition(transition2) {
456
- if (transition2.D || transition2.Y || transition2.K.size || transition2.t.size)
457
- return;
458
- globalQueue.h[0].push.apply(globalQueue.h[0], transition2.h[0]);
459
- globalQueue.h[1].push.apply(globalQueue.h[1], transition2.h[1]);
460
- resolveQueues(transition2.i);
461
- for (const [source, clone] of transition2.b) {
462
- if (source === clone || source.f !== transition2) {
463
- delete source.f;
464
- continue;
465
- }
466
- if (clone.b)
467
- replaceSourceObservers(clone, transition2);
468
- if (clone.Z || clone.a === STATE_DISPOSED) {
469
- source.dispose(clone.a === STATE_DISPOSED);
470
- source.emptyDisposal();
471
- delete clone.Z;
472
- } else {
473
- delete clone.n;
474
- delete clone.o;
475
- }
476
- Object.assign(source, clone);
477
- delete source.d;
478
- let current = clone.n;
479
- if (current?.z === clone)
480
- current.z = source;
481
- while (current?.l === clone) {
482
- current.l = source;
483
- current = current.n;
484
432
  }
485
- delete source.f;
486
433
  }
487
- transition2.D = true;
488
- for (const reset of transition2.j) {
489
- delete reset.f;
490
- reset();
434
+ if (el.b & 2 /* Dirty */) {
435
+ recompute(el);
491
436
  }
492
- transition2.aa.write(true);
493
- globalQueue.flush();
437
+ el.b = 0 /* None */;
494
438
  }
495
-
496
- // src/core/owner.ts
497
- var currentOwner = null;
498
- var defaultContext = {};
499
- function getOwner() {
500
- return currentOwner;
501
- }
502
- function setOwner(owner) {
503
- const out = currentOwner;
504
- currentOwner = owner;
505
- return out;
506
- }
507
- var Owner = class {
508
- // We flatten the owner tree into a linked list so that we don't need a pointer to .firstChild
509
- // However, the children are actually added in reverse creation order
510
- // See comment at the top of the file for an example of the _nextSibling traversal
511
- l = null;
512
- n = null;
513
- z = null;
514
- a = STATE_CLEAN;
515
- o = null;
516
- A = defaultContext;
517
- E = globalQueue;
518
- ga = 0;
519
- id = null;
520
- constructor(id = null, skipAppend = false) {
521
- this.id = id;
522
- if (currentOwner) {
523
- !skipAppend && currentOwner.append(this);
524
- }
525
- }
526
- append(child) {
527
- child.l = this;
528
- child.z = this;
529
- if (this.n)
530
- this.n.z = child;
531
- child.n = this.n;
532
- this.n = child;
533
- if (this.id != null && child.id == null)
534
- child.id = this.getNextChildId();
535
- if (child.A !== this.A) {
536
- child.A = { ...this.A, ...child.A };
537
- }
538
- if (this.E)
539
- child.E = this.E;
540
- }
541
- dispose(self = true) {
542
- if (this.a === STATE_DISPOSED)
543
- return;
544
- let head = self ? this.z || this.l : this, current = this.n, next = null;
545
- while (current && current.l === this) {
546
- current.dispose(true);
547
- next = current.n;
548
- current.n = null;
549
- current = next;
550
- }
551
- this.ga = 0;
552
- if (self)
553
- this.M();
554
- if (current)
555
- current.z = !self ? this : this.z;
556
- if (head)
557
- head.n = current;
558
- }
559
- M() {
560
- if (this.z)
561
- this.z.n = null;
562
- this.l = null;
563
- this.z = null;
564
- this.A = defaultContext;
565
- this.a = STATE_DISPOSED;
566
- this.emptyDisposal();
567
- }
568
- emptyDisposal() {
569
- if (!this.o)
439
+ function unlinkSubs(link2) {
440
+ const dep = link2.P;
441
+ const nextDep = link2.E;
442
+ const nextSub = link2.y;
443
+ const prevSub = link2.ma;
444
+ if (nextSub !== null) {
445
+ nextSub.ma = prevSub;
446
+ } else {
447
+ dep.W = prevSub;
448
+ }
449
+ if (prevSub !== null) {
450
+ prevSub.y = nextSub;
451
+ } else {
452
+ dep.p = nextSub;
453
+ }
454
+ return nextDep;
455
+ }
456
+ function link(dep, sub) {
457
+ const prevDep = sub.H;
458
+ if (prevDep !== null && prevDep.P === dep) {
459
+ return;
460
+ }
461
+ let nextDep = null;
462
+ const isRecomputing = sub.b & 4 /* RecomputingDeps */;
463
+ if (isRecomputing) {
464
+ nextDep = prevDep !== null ? prevDep.E : sub.u;
465
+ if (nextDep !== null && nextDep.P === dep) {
466
+ sub.H = nextDep;
570
467
  return;
571
- if (Array.isArray(this.o)) {
572
- for (let i = 0; i < this.o.length; i++) {
573
- const callable = this.o[i];
574
- callable.call(callable);
575
- }
576
- } else {
577
- this.o.call(this.o);
578
468
  }
579
- this.o = null;
580
469
  }
581
- getNextChildId() {
582
- if (this.id != null)
583
- return formatId(this.id, this.ga++);
584
- throw new Error("Cannot get child id from owner without an id");
470
+ const prevSub = dep.W;
471
+ if (prevSub !== null && prevSub.m === sub && (!isRecomputing || isValidLink(prevSub, sub))) {
472
+ return;
585
473
  }
586
- };
587
- function createContext(defaultValue, description) {
588
- return { id: Symbol(description), defaultValue };
589
- }
590
- function getContext(context, owner = currentOwner) {
591
- if (!owner) {
592
- throw new NoOwnerError();
474
+ const newLink = sub.H = dep.W = {
475
+ P: dep,
476
+ m: sub,
477
+ E: nextDep,
478
+ ma: prevSub,
479
+ y: null
480
+ };
481
+ if (prevDep !== null) {
482
+ prevDep.E = newLink;
483
+ } else {
484
+ sub.u = newLink;
593
485
  }
594
- const value = hasContext(context, owner) ? owner.A[context.id] : context.defaultValue;
595
- if (isUndefined(value)) {
596
- throw new ContextNotFoundError();
486
+ if (prevSub !== null) {
487
+ prevSub.y = newLink;
488
+ } else {
489
+ dep.p = newLink;
597
490
  }
598
- return value;
599
491
  }
600
- function setContext(context, value, owner = currentOwner) {
601
- if (!owner) {
602
- throw new NoOwnerError();
492
+ function isValidLink(checkLink, sub) {
493
+ const depsTail = sub.H;
494
+ if (depsTail !== null) {
495
+ let link2 = sub.u;
496
+ do {
497
+ if (link2 === checkLink) {
498
+ return true;
499
+ }
500
+ if (link2 === depsTail) {
501
+ break;
502
+ }
503
+ link2 = link2.E;
504
+ } while (link2 !== null);
603
505
  }
604
- owner.A = {
605
- ...owner.A,
606
- [context.id]: isUndefined(value) ? context.defaultValue : value
607
- };
506
+ return false;
608
507
  }
609
- function hasContext(context, owner = currentOwner) {
610
- return !isUndefined(owner?.A[context.id]);
508
+ function setStatusFlags(signal2, flags, error = null) {
509
+ signal2.f = flags;
510
+ signal2.B = error;
611
511
  }
612
- function onCleanup(fn) {
613
- if (!currentOwner)
614
- return fn;
615
- const node = currentOwner;
616
- if (!node.o) {
617
- node.o = fn;
618
- } else if (Array.isArray(node.o)) {
619
- node.o.push(fn);
512
+ function setError(signal2, error) {
513
+ setStatusFlags(signal2, 2 /* Error */ | 4 /* Uninitialized */, error);
514
+ }
515
+ function clearStatusFlags(signal2) {
516
+ setStatusFlags(signal2, 0 /* None */);
517
+ }
518
+ function markDisposal(el) {
519
+ let child = el.n;
520
+ while (child) {
521
+ child.b |= 32 /* Zombie */;
522
+ const inHeap = child.b & 8 /* InHeap */;
523
+ if (inHeap) {
524
+ deleteFromHeap(child, dirtyQueue);
525
+ insertIntoHeap(child, zombieQueue);
526
+ }
527
+ markDisposal(child);
528
+ child = child.K;
529
+ }
530
+ }
531
+ function disposeChildren(node, self = false, zombie) {
532
+ if (node.b & 64 /* Disposed */)
533
+ return;
534
+ if (self)
535
+ node.b = 64 /* Disposed */;
536
+ let child = zombie ? node.T : node.n;
537
+ while (child) {
538
+ const nextChild = child.K;
539
+ if (child.u) {
540
+ const n = child;
541
+ deleteFromHeap(n, n.b & 32 /* Zombie */ ? zombieQueue : dirtyQueue);
542
+ let toRemove = n.u;
543
+ do {
544
+ toRemove = unlinkSubs(toRemove);
545
+ } while (toRemove !== null);
546
+ n.u = null;
547
+ n.H = null;
548
+ }
549
+ disposeChildren(child, true);
550
+ child = nextChild;
551
+ }
552
+ if (zombie) {
553
+ node.T = null;
620
554
  } else {
621
- node.o = [node.o, fn];
555
+ node.n = null;
556
+ node.K = null;
622
557
  }
623
- return fn;
558
+ runDisposal(node, zombie);
559
+ }
560
+ function runDisposal(node, zombie) {
561
+ let disposal = zombie ? node.U : node.q;
562
+ if (!disposal)
563
+ return;
564
+ if (Array.isArray(disposal)) {
565
+ for (let i = 0; i < disposal.length; i++) {
566
+ const callable = disposal[i];
567
+ callable.call(callable);
568
+ }
569
+ } else {
570
+ disposal.call(disposal);
571
+ }
572
+ zombie ? node.U = null : node.q = null;
573
+ }
574
+ function withOptions(obj, options) {
575
+ obj.id = options?.id ?? (context?.id != null ? getNextChildId(context) : void 0);
576
+ obj.da = options?.equals != null ? options.equals : isEqual;
577
+ obj.xa = !!options?.pureWrite;
578
+ obj.ra = options?.unobserved;
579
+ if (options?.ja)
580
+ Object.assign(obj, options.ja);
581
+ return obj;
582
+ }
583
+ function getNextChildId(owner) {
584
+ if (owner.id != null)
585
+ return formatId(owner.id, owner.na++);
586
+ throw new Error("Cannot get child id from owner without an id");
624
587
  }
625
588
  function formatId(prefix, id) {
626
589
  const num = id.toString(36), len = num.length - 1;
627
590
  return prefix + (len ? String.fromCharCode(64 + len) : "") + num;
628
591
  }
629
- function isUndefined(value) {
630
- return typeof value === "undefined";
592
+ function computed(fn, initialValue, options) {
593
+ const self = withOptions(
594
+ {
595
+ q: null,
596
+ i: globalQueue,
597
+ D: defaultContext,
598
+ na: 0,
599
+ ha: fn,
600
+ g: initialValue,
601
+ e: 0,
602
+ aa: null,
603
+ O: void 0,
604
+ x: null,
605
+ u: null,
606
+ H: null,
607
+ p: null,
608
+ W: null,
609
+ s: context,
610
+ K: null,
611
+ n: null,
612
+ b: 0 /* None */,
613
+ f: 4 /* Uninitialized */,
614
+ V: clock,
615
+ d: NOT_PENDING,
616
+ U: null,
617
+ T: null
618
+ },
619
+ options
620
+ );
621
+ self.x = self;
622
+ const parent = context?.Z ? context._ : context;
623
+ if (context) {
624
+ context.i && (self.i = context.i);
625
+ context.D && (self.D = context.D);
626
+ const lastChild = context.n;
627
+ if (lastChild === null) {
628
+ context.n = self;
629
+ } else {
630
+ self.K = lastChild;
631
+ context.n = self;
632
+ }
633
+ }
634
+ if (parent)
635
+ self.e = parent.e + 1;
636
+ recompute(self, true);
637
+ return self;
631
638
  }
632
-
633
- // src/core/core.ts
634
- var currentObserver = null;
635
- var currentMask = DEFAULT_FLAGS;
636
- var newSources = null;
637
- var newSourcesIndex = 0;
638
- var newFlags = 0;
639
- var notStale = false;
640
- var updateCheck = null;
641
- var staleCheck = null;
642
- function getObserver() {
643
- return currentObserver;
644
- }
645
- var UNCHANGED = Symbol(0);
646
- var Computation = class extends Owner {
647
- b = null;
648
- c = null;
649
- m;
650
- O;
651
- P;
652
- // Used in __DEV__ mode, hopefully removed in production
653
- na;
654
- // Using false is an optimization as an alternative to _equals: () => false
655
- // which could enable more efficient DIRTY notification
656
- ba = isEqual;
657
- fa;
658
- ja = false;
659
- /** Whether the computation is an error or has ancestors that are unresolved */
660
- g = 0;
661
- /** Which flags raised by sources are handled, vs. being passed through. */
662
- ca = DEFAULT_FLAGS;
663
- Q = -1;
664
- H = false;
665
- f;
666
- d;
667
- j;
668
- constructor(initialValue, compute2, options) {
669
- super(options?.id, compute2 === null);
670
- this.P = compute2;
671
- this.a = compute2 ? STATE_DIRTY : STATE_CLEAN;
672
- this.g = compute2 && initialValue === void 0 ? UNINITIALIZED_BIT : 0;
673
- this.m = initialValue;
674
- if (options?.equals !== void 0)
675
- this.ba = options.equals;
676
- this.ja = !!options?.pureWrite;
677
- this.fa = options?.unobserved;
678
- if (ActiveTransition) {
679
- this.f = ActiveTransition;
680
- ActiveTransition.b.set(this, this);
681
- }
682
- }
683
- ha() {
684
- if (staleCheck && (this.g & LOADING_BIT || this.f)) {
685
- staleCheck.m = true;
686
- this.f?.aa.read();
687
- }
688
- track(this);
689
- newFlags |= this.g & ~currentMask;
690
- if (this.g & ERROR_BIT) {
691
- throw this.O;
639
+ function asyncComputed(asyncFn, initialValue, options) {
640
+ let lastResult = void 0;
641
+ let refreshing = false;
642
+ const fn = (prev) => {
643
+ const result = asyncFn(prev, refreshing);
644
+ refreshing = false;
645
+ lastResult = result;
646
+ const isPromise = result instanceof Promise;
647
+ const iterator = result[Symbol.asyncIterator];
648
+ if (!isPromise && !iterator) {
649
+ return result;
650
+ }
651
+ if (isPromise) {
652
+ result.then((v) => {
653
+ if (lastResult !== result)
654
+ return;
655
+ globalQueue.initTransition(self);
656
+ setSignal(self, () => v);
657
+ flush();
658
+ }).catch((e) => {
659
+ if (lastResult !== result)
660
+ return;
661
+ globalQueue.initTransition(self);
662
+ setError(self, e);
663
+ flush();
664
+ });
692
665
  } else {
693
- return this.m;
694
- }
695
- }
696
- /**
697
- * Return the current value of this computation
698
- * Automatically re-executes the surrounding computation when the value changes
699
- */
700
- read() {
701
- if (ActiveTransition && (ActiveTransition.b.has(this) || !this.d && this.g & (UNINITIALIZED_BIT | ERROR_BIT))) {
702
- const clone = ActiveTransition.b.get(this) || cloneGraph(this);
703
- if (clone !== this)
704
- return clone.read();
705
- }
706
- if (this.P) {
707
- if (this.g & ERROR_BIT && this.Q <= clock)
708
- update(this);
709
- else
710
- this.F();
711
- }
712
- return this.ha();
713
- }
714
- /**
715
- * Return the current value of this computation
716
- * Automatically re-executes the surrounding computation when the value changes
717
- *
718
- * If the computation has any unresolved ancestors, this function waits for the value to resolve
719
- * before continuing
720
- */
721
- wait() {
722
- if (ActiveTransition && (ActiveTransition.b.has(this) || !this.d && this.g & (UNINITIALIZED_BIT | ERROR_BIT))) {
723
- const clone = ActiveTransition.b.get(this) || cloneGraph(this);
724
- if (clone !== this)
725
- return clone.wait();
726
- }
727
- if (this.P) {
728
- if (this.g & ERROR_BIT && this.Q <= clock)
729
- update(this);
730
- else
731
- this.F();
732
- }
733
- if ((notStale || this.g & UNINITIALIZED_BIT) && this.g & LOADING_BIT) {
734
- throw new NotReadyError(this);
735
- }
736
- return this.ha();
737
- }
738
- /** Update the computation with a new value. */
739
- write(value, flags = 0, raw = false) {
740
- if (ActiveTransition && !this.d) {
741
- const clone = cloneGraph(this);
742
- if (clone !== this)
743
- return clone.write(value, flags, raw);
744
- }
745
- const newValue = !raw && typeof value === "function" ? value(this.m) : value;
746
- const valueChanged = newValue !== UNCHANGED && (!!(this.g & UNINITIALIZED_BIT) || // this._stateFlags & LOADING_BIT & ~flags ||
747
- this.ba === false || !this.ba(this.m, newValue));
748
- if (valueChanged) {
749
- this.m = newValue;
750
- this.O = void 0;
751
- }
752
- const changedFlagsMask = this.g ^ flags, changedFlags = changedFlagsMask & flags;
753
- this.g = flags;
754
- this.Q = clock + 1;
755
- if (this.c && !(this.j && ActiveTransition)) {
756
- for (let i = 0; i < this.c.length; i++) {
757
- if (valueChanged) {
758
- this.c[i].u(STATE_DIRTY);
759
- } else if (changedFlagsMask) {
760
- this.c[i]._(changedFlagsMask, changedFlags);
666
+ (async () => {
667
+ try {
668
+ for await (let value of result) {
669
+ if (lastResult !== result)
670
+ return;
671
+ globalQueue.initTransition(self);
672
+ setSignal(self, () => value);
673
+ flush();
674
+ }
675
+ } catch (error) {
676
+ if (lastResult !== result)
677
+ return;
678
+ globalQueue.initTransition(self);
679
+ setError(self, error);
680
+ flush();
761
681
  }
762
- }
682
+ })();
763
683
  }
764
- return this.m;
684
+ globalQueue.initTransition(context);
685
+ throw new NotReadyError(context);
686
+ };
687
+ const self = computed(fn, initialValue, options);
688
+ self.sa = () => {
689
+ refreshing = true;
690
+ recompute(self);
691
+ flush();
692
+ };
693
+ return self;
694
+ }
695
+ function signal(v, options, firewall = null) {
696
+ if (firewall !== null) {
697
+ return firewall.aa = withOptions(
698
+ {
699
+ g: v,
700
+ p: null,
701
+ W: null,
702
+ z: firewall,
703
+ qa: firewall.aa,
704
+ f: 0 /* None */,
705
+ V: clock,
706
+ d: NOT_PENDING
707
+ },
708
+ options
709
+ );
710
+ } else {
711
+ return withOptions(
712
+ {
713
+ g: v,
714
+ p: null,
715
+ W: null,
716
+ f: 0 /* None */,
717
+ V: clock,
718
+ d: NOT_PENDING
719
+ },
720
+ options
721
+ );
765
722
  }
766
- /**
767
- * Set the current node's state, and recursively mark all of this node's observers as STATE_CHECK
768
- */
769
- u(state, skipQueue) {
770
- if (this.a >= state && !this.H)
771
- return;
772
- this.H = !!skipQueue;
773
- this.a = state;
774
- if (this.c && !(this.j && ActiveTransition)) {
775
- for (let i = 0; i < this.c.length; i++) {
776
- this.c[i].u(STATE_CHECK, skipQueue);
723
+ }
724
+ function isEqual(a, b) {
725
+ return a === b;
726
+ }
727
+ function untrack(fn) {
728
+ if (!tracking)
729
+ return fn();
730
+ tracking = false;
731
+ try {
732
+ return fn();
733
+ } finally {
734
+ tracking = true;
735
+ }
736
+ }
737
+ function read(el) {
738
+ let c = context;
739
+ if (c?.Z)
740
+ c = c._;
741
+ if (c && tracking) {
742
+ link(el, c);
743
+ const owner = "_owner" in el ? el.z : el;
744
+ if ("_fn" in owner) {
745
+ const isZombie = el.b & 32 /* Zombie */;
746
+ if (owner.e >= (isZombie ? zombieQueue.t : dirtyQueue.t)) {
747
+ markNode(c);
748
+ markHeap(isZombie ? zombieQueue : dirtyQueue);
749
+ updateIfNecessary(owner);
777
750
  }
778
- }
779
- }
780
- /**
781
- * Notify the computation that one of its sources has changed flags.
782
- *
783
- * @param mask A bitmask for which flag(s) were changed.
784
- * @param newFlags The source's new flags, masked to just the changed ones.
785
- */
786
- _(mask, newFlags2) {
787
- if (this.a >= STATE_DIRTY)
788
- return;
789
- if (mask & this.ca || this.j && ActiveTransition) {
790
- this.u(STATE_DIRTY);
791
- return;
792
- }
793
- if (this.a >= STATE_CHECK && !this.H)
794
- return;
795
- const prevFlags = this.g & mask;
796
- const deltaFlags = prevFlags ^ newFlags2;
797
- if (newFlags2 === prevFlags) ; else if (deltaFlags & prevFlags & mask) {
798
- this.u(STATE_CHECK);
799
- } else {
800
- this.g ^= deltaFlags;
801
- if (this.c) {
802
- for (let i = 0; i < this.c.length; i++) {
803
- this.c[i]._(mask, newFlags2);
804
- }
751
+ const height = owner.e;
752
+ if (height >= c.e && el.s !== c) {
753
+ c.e = height + 1;
805
754
  }
806
755
  }
807
756
  }
808
- N(error) {
809
- if (ActiveTransition && !this.d) {
810
- const clone = cloneGraph(this);
811
- if (clone !== this)
812
- return clone.N(error);
813
- }
814
- this.O = error;
815
- this.write(UNCHANGED, this.g & ~LOADING_BIT | ERROR_BIT | UNINITIALIZED_BIT);
816
- }
817
- /**
818
- * This is the core part of the reactivity system, which makes sure that the values are updated
819
- * before they are read. We've also adapted it to return the loading state of the computation,
820
- * so that we can propagate that to the computation's observers.
821
- *
822
- * This function will ensure that the value and states we read from the computation are up to date
823
- */
824
- F() {
825
- if (!this.P) {
826
- return;
757
+ if (pendingCheck) {
758
+ const pendingResult = (el.f & 1 /* Pending */) !== 0 || !!el.S || false;
759
+ if (!el.G) {
760
+ el.G = signal(pendingResult);
761
+ el.G.ia = true;
762
+ el.G.ca = (v) => setSignal(el.G, v);
827
763
  }
828
- if (this.a === STATE_DISPOSED) {
829
- return;
764
+ const prev = pendingCheck;
765
+ pendingCheck = null;
766
+ read(el.G);
767
+ pendingCheck = prev;
768
+ prev.g = pendingResult || prev.g;
769
+ }
770
+ if (pendingValueCheck) {
771
+ if (!el.C) {
772
+ el.C = signal(
773
+ el.d === NOT_PENDING ? el.g : el.d
774
+ );
775
+ el.C.ia = true;
776
+ el.C.ca = (v) => queueMicrotask(() => queueMicrotask(() => setSignal(el.C, v)));
830
777
  }
831
- if (this.a === STATE_CLEAN) {
832
- return;
778
+ pendingValueCheck = false;
779
+ try {
780
+ return read(el.C);
781
+ } finally {
782
+ pendingValueCheck = true;
833
783
  }
834
- let observerFlags = 0;
835
- if (this.a === STATE_CHECK) {
836
- for (let i = 0; i < this.b.length; i++) {
837
- const source = getTransitionSource(this.b[i]);
838
- source.F();
839
- observerFlags |= source.g & ~UNINITIALIZED_BIT;
840
- if (this.a === STATE_DIRTY) {
841
- break;
842
- }
843
- }
784
+ }
785
+ if (el.f & 1 /* Pending */) {
786
+ if (c && !stale || el.f & 4 /* Uninitialized */)
787
+ throw el.B;
788
+ else if (c && stale && !pendingCheck) {
789
+ setStatusFlags(
790
+ c,
791
+ c.f | 1,
792
+ el.B
793
+ );
844
794
  }
845
- if (this.a === STATE_DIRTY) {
846
- update(this);
795
+ }
796
+ if (el.f & 2 /* Error */) {
797
+ if (el.V < clock) {
798
+ recompute(el, true);
799
+ return read(el);
847
800
  } else {
848
- this.write(UNCHANGED, observerFlags);
849
- this.a = STATE_CLEAN;
801
+ throw el.B;
850
802
  }
851
803
  }
852
- /**
853
- * Remove ourselves from the owner graph and the computation graph
854
- */
855
- M() {
856
- if (this.a === STATE_DISPOSED)
857
- return;
858
- if (this.b)
859
- removeSourceObservers(this, 0);
860
- super.M();
804
+ return !c || el.d === NOT_PENDING || stale && !pendingCheck && el.S && activeTransition !== el.S ? el.g : el.d;
805
+ }
806
+ function setSignal(el, v) {
807
+ if (typeof v === "function") {
808
+ v = v(
809
+ el.d === NOT_PENDING ? el.g : el.d
810
+ );
861
811
  }
862
- };
863
- function track(computation) {
864
- if (ActiveTransition && computation.d)
865
- computation = computation.d;
866
- if (currentObserver) {
867
- if (!newSources && currentObserver.b && currentObserver.b[newSourcesIndex] === computation) {
868
- newSourcesIndex++;
869
- } else if (!newSources)
870
- newSources = [computation];
871
- else if (computation !== newSources[newSources.length - 1]) {
872
- newSources.push(computation);
873
- }
874
- if (updateCheck) {
875
- updateCheck.m = computation.Q > currentObserver.Q;
876
- }
877
- }
878
- }
879
- function update(node) {
880
- const prevSources = newSources, prevSourcesIndex = newSourcesIndex, prevFlags = newFlags;
881
- newSources = null;
882
- newSourcesIndex = 0;
883
- newFlags = 0;
884
- try {
885
- if (ActiveTransition && node.d && !node.Z) {
886
- initialDispose(node.d);
887
- node.Z = true;
888
- }
889
- node.dispose(false);
890
- node.emptyDisposal();
891
- const result = compute(node, node.P, node);
892
- node.write(result, newFlags, true);
893
- } catch (error) {
894
- if (error instanceof NotReadyError) {
895
- if (error.cause !== node)
896
- compute(
897
- node,
898
- () => track(error.cause),
899
- node
900
- );
901
- node.write(UNCHANGED, newFlags | LOADING_BIT | node.g & UNINITIALIZED_BIT);
902
- } else {
903
- node.N(error);
812
+ const valueChanged = !el.da || !el.da(el.d === NOT_PENDING ? el.g : el.d, v);
813
+ if (!valueChanged && !el.f)
814
+ return v;
815
+ if (valueChanged) {
816
+ if (el.ia)
817
+ el.g = v;
818
+ else {
819
+ if (el.d === NOT_PENDING)
820
+ globalQueue.h.push(el);
821
+ el.d = v;
904
822
  }
905
- } finally {
906
- if (newSources) {
907
- if (node.b)
908
- removeSourceObservers(node, newSourcesIndex);
909
- if (node.b && newSourcesIndex > 0) {
910
- node.b.length = newSourcesIndex + newSources.length;
911
- for (let i = 0; i < newSources.length; i++) {
912
- node.b[newSourcesIndex + i] = newSources[i];
913
- }
914
- } else {
915
- node.b = newSources;
916
- }
917
- let source;
918
- for (let i = newSourcesIndex; i < node.b.length; i++) {
919
- source = getTransitionSource(node.b[i]);
920
- if (!source.c)
921
- source.c = [node];
922
- else
923
- source.c.push(node);
924
- }
925
- } else if (node.b && newSourcesIndex < node.b.length) {
926
- removeSourceObservers(node, newSourcesIndex);
927
- node.b.length = newSourcesIndex;
823
+ if (el.C)
824
+ el.C.ca(v);
825
+ }
826
+ clearStatusFlags(el);
827
+ el.V = clock;
828
+ for (let link2 = el.p; link2 !== null; link2 = link2.y) {
829
+ insertIntoHeap(link2.m, link2.m.b & 32 /* Zombie */ ? zombieQueue : dirtyQueue);
830
+ }
831
+ schedule();
832
+ return v;
833
+ }
834
+ function getObserver() {
835
+ return tracking ? context : null;
836
+ }
837
+ function getOwner() {
838
+ return context;
839
+ }
840
+ function onCleanup(fn) {
841
+ if (!context)
842
+ return fn;
843
+ const node = context;
844
+ if (!node.q) {
845
+ node.q = fn;
846
+ } else if (Array.isArray(node.q)) {
847
+ node.q.push(fn);
848
+ } else {
849
+ node.q = [node.q, fn];
850
+ }
851
+ return fn;
852
+ }
853
+ function createOwner(options) {
854
+ const parent = context;
855
+ const owner = {
856
+ Z: true,
857
+ _: parent?.Z ? parent._ : parent,
858
+ n: null,
859
+ K: null,
860
+ q: null,
861
+ id: options?.id ?? (parent?.id != null ? getNextChildId(parent) : void 0),
862
+ i: parent?.i ?? globalQueue,
863
+ D: parent?.D || defaultContext,
864
+ na: 0,
865
+ U: null,
866
+ T: null,
867
+ s: parent,
868
+ dispose(self = true) {
869
+ disposeChildren(owner, self);
870
+ }
871
+ };
872
+ if (parent) {
873
+ const lastChild = parent.n;
874
+ if (lastChild === null) {
875
+ parent.n = owner;
876
+ } else {
877
+ owner.K = lastChild;
878
+ parent.n = owner;
928
879
  }
929
- newSources = prevSources;
930
- newSourcesIndex = prevSourcesIndex;
931
- newFlags = prevFlags;
932
- node.Q = clock + 1;
933
- node.a = STATE_CLEAN;
934
880
  }
881
+ return owner;
935
882
  }
936
- function isEqual(a, b) {
937
- return a === b;
883
+ function createRoot(init, options) {
884
+ const owner = createOwner(options);
885
+ return runWithOwner(owner, () => init(owner.dispose));
938
886
  }
939
- function untrack(fn) {
940
- if (currentObserver === null)
887
+ function runWithOwner(owner, fn) {
888
+ const oldContext = context;
889
+ context = owner;
890
+ try {
891
+ return fn();
892
+ } finally {
893
+ context = oldContext;
894
+ }
895
+ }
896
+ function staleValues(fn, set = true) {
897
+ const prevStale = stale;
898
+ stale = set;
899
+ try {
941
900
  return fn();
942
- return compute(getOwner(), fn, null);
901
+ } finally {
902
+ stale = prevStale;
903
+ }
943
904
  }
944
- function hasUpdated(fn) {
945
- const current = updateCheck;
946
- updateCheck = { m: false };
905
+ function pending(fn) {
906
+ const prevLatest = pendingValueCheck;
907
+ pendingValueCheck = true;
947
908
  try {
948
- fn();
949
- return updateCheck.m;
909
+ return staleValues(fn, false);
950
910
  } finally {
951
- updateCheck = current;
911
+ pendingValueCheck = prevLatest;
952
912
  }
953
913
  }
954
- function pendingCheck(fn, loadingValue) {
955
- const current = staleCheck;
956
- staleCheck = { m: false };
914
+ function isPending(fn, loadingValue) {
915
+ const current = pendingCheck;
916
+ pendingCheck = { g: false };
957
917
  try {
958
- latest(fn);
959
- return staleCheck.m;
918
+ staleValues(fn);
919
+ return pendingCheck.g;
960
920
  } catch (err) {
961
921
  if (!(err instanceof NotReadyError))
962
922
  return false;
@@ -964,413 +924,161 @@ function pendingCheck(fn, loadingValue) {
964
924
  return loadingValue;
965
925
  throw err;
966
926
  } finally {
967
- staleCheck = current;
927
+ pendingCheck = current;
968
928
  }
969
929
  }
970
- function isPending(fn, loadingValue) {
971
- if (!currentObserver)
972
- return pendingCheck(fn, loadingValue);
973
- const c = new Computation(void 0, () => pendingCheck(fn, loadingValue));
974
- c.j = () => c.write(false);
975
- c.j.ia = () => globalQueue.enqueue(0, () => c.j.f && c.write(true));
976
- c.ca |= LOADING_BIT;
977
- const res = c.wait();
978
- c.o = () => {
979
- if (c.j.f) {
980
- c.j.f.j.delete(c.j);
981
- delete c.j.f;
982
- }
983
- };
984
- return res;
930
+
931
+ // src/core/context.ts
932
+ function createContext(defaultValue, description) {
933
+ return { id: Symbol(description), defaultValue };
985
934
  }
986
- function latest(fn, fallback) {
987
- const argLength = arguments.length;
988
- const prevFlags = newFlags;
989
- const prevNotStale = notStale;
990
- notStale = false;
991
- try {
992
- return fn();
993
- } catch (err) {
994
- if (argLength > 1 && err instanceof NotReadyError)
995
- return fallback;
996
- throw err;
997
- } finally {
998
- newFlags = prevFlags;
999
- notStale = prevNotStale;
935
+ function getContext(context2, owner = getOwner()) {
936
+ if (!owner) {
937
+ throw new NoOwnerError();
1000
938
  }
939
+ const value = hasContext(context2, owner) ? owner.D[context2.id] : context2.defaultValue;
940
+ if (isUndefined(value)) {
941
+ throw new ContextNotFoundError();
942
+ }
943
+ return value;
1001
944
  }
1002
- function compute(owner, fn, observer) {
1003
- const prevOwner = setOwner(owner), prevObserver = currentObserver, prevMask = currentMask, prevNotStale = notStale;
1004
- currentObserver = observer;
1005
- currentMask = observer?.ca ?? DEFAULT_FLAGS;
1006
- notStale = true;
1007
- try {
1008
- return fn.call(observer, observer ? observer.m : void 0);
1009
- } finally {
1010
- setOwner(prevOwner);
1011
- currentObserver = prevObserver;
1012
- currentMask = prevMask;
1013
- notStale = prevNotStale;
945
+ function setContext(context2, value, owner = getOwner()) {
946
+ if (!owner) {
947
+ throw new NoOwnerError();
1014
948
  }
949
+ owner.D = {
950
+ ...owner.D,
951
+ [context2.id]: isUndefined(value) ? context2.defaultValue : value
952
+ };
953
+ }
954
+ function hasContext(context2, owner) {
955
+ return !isUndefined(owner?.D[context2.id]);
956
+ }
957
+ function isUndefined(value) {
958
+ return typeof value === "undefined";
1015
959
  }
1016
960
 
1017
961
  // src/core/effect.ts
1018
- var Effect = class extends Computation {
1019
- da;
1020
- $;
1021
- w;
1022
- ea = false;
1023
- T;
1024
- s;
1025
- constructor(initialValue, compute2, effect, error, options) {
1026
- super(initialValue, compute2, options);
1027
- this.da = effect;
1028
- this.$ = error;
1029
- this.T = initialValue;
1030
- this.s = options?.render ? EFFECT_RENDER : EFFECT_USER;
1031
- if (this.s === EFFECT_RENDER) {
1032
- this.P = function(p) {
1033
- return !this.d && clock > this.E.created && !(this.g & ERROR_BIT) ? latest(() => compute2(p)) : compute2(p);
1034
- };
1035
- }
1036
- this.F();
1037
- !options?.defer && (this.s === EFFECT_USER ? getQueue(this).enqueue(this.s, this.x.bind(this)) : this.x(this.s));
1038
- }
1039
- write(value, flags = 0) {
1040
- if (this.a == STATE_DIRTY) {
1041
- this.g = flags;
1042
- if (this.s === EFFECT_RENDER) {
1043
- getQueue(this).notify(this, LOADING_BIT | ERROR_BIT, this.g);
1044
- }
1045
- }
1046
- if (value === UNCHANGED)
1047
- return this.m;
1048
- this.m = value;
1049
- this.ea = true;
1050
- this.O = void 0;
1051
- return value;
1052
- }
1053
- u(state, skipQueue) {
1054
- if (this.a >= state || skipQueue)
1055
- return;
1056
- if (this.a === STATE_CLEAN || this.d && !ActiveTransition)
1057
- getQueue(this).enqueue(this.s, this.x.bind(this));
1058
- this.a = state;
1059
- }
1060
- _(mask, newFlags2) {
1061
- if (this.d) {
1062
- if (this.a >= STATE_DIRTY)
1063
- return;
1064
- if (mask & 3) {
1065
- this.u(STATE_DIRTY);
1066
- return;
1067
- }
1068
- }
1069
- super._(mask, newFlags2);
1070
- }
1071
- N(error) {
1072
- this.O = error;
1073
- getQueue(this).notify(this, LOADING_BIT, 0);
1074
- this.g = ERROR_BIT;
1075
- if (this.s === EFFECT_USER) {
1076
- try {
1077
- return this.$ ? this.$(error, () => {
1078
- this.w?.();
1079
- this.w = void 0;
1080
- }) : console.error(error);
1081
- } catch (e) {
1082
- error = e;
1083
- }
1084
- }
1085
- if (!getQueue(this).notify(this, ERROR_BIT, ERROR_BIT))
1086
- throw error;
1087
- }
1088
- M() {
1089
- if (this.a === STATE_DISPOSED)
1090
- return;
1091
- this.da = void 0;
1092
- this.T = void 0;
1093
- this.$ = void 0;
1094
- this.w?.();
1095
- this.w = void 0;
1096
- getQueue(this).notify(this, ERROR_BIT | LOADING_BIT, 0);
1097
- super.M();
1098
- }
1099
- x(type) {
1100
- if (type) {
1101
- const effect = this.d || this;
1102
- if (effect.ea && effect.a !== STATE_DISPOSED) {
1103
- effect.w?.();
1104
- try {
1105
- effect.w = effect.da(effect.m, effect.T);
1106
- } catch (e) {
1107
- if (!getQueue(effect).notify(effect, ERROR_BIT, ERROR_BIT))
1108
- throw e;
1109
- } finally {
1110
- effect.T = effect.m;
1111
- effect.ea = false;
962
+ function effect(compute, effect2, error, initialValue, options) {
963
+ let initialized = false;
964
+ const node = computed(compute, initialValue, {
965
+ ...options,
966
+ ja: {
967
+ ea: true,
968
+ oa: initialValue,
969
+ ta: effect2,
970
+ pa: error,
971
+ L: void 0,
972
+ i: getOwner()?.i ?? globalQueue,
973
+ I: options?.render ? 1 /* Render */ : 2 /* User */,
974
+ la(statusFlagsChanged, prevStatusFlags) {
975
+ if (initialized) {
976
+ const errorChanged = this.f && this.f === prevStatusFlags && statusFlagsChanged;
977
+ this.ea = !(this.f & 2 /* Error */) && !(this.f & 1 /* Pending */ & ~prevStatusFlags) && !errorChanged;
978
+ if (this.ea)
979
+ this.i.enqueue(this.I, runEffect.bind(this));
980
+ }
981
+ if (this.f & 2 /* Error */) {
982
+ let error2 = this.B;
983
+ this.i.notify(this, 1 /* Pending */, 0);
984
+ if (this.I === 2 /* User */) {
985
+ try {
986
+ return this.pa ? this.pa(error2, () => {
987
+ this.L?.();
988
+ this.L = void 0;
989
+ }) : console.error(error2);
990
+ } catch (e) {
991
+ error2 = e;
992
+ }
993
+ }
994
+ if (!this.i.notify(this, 2 /* Error */, 2 /* Error */))
995
+ throw error2;
996
+ } else if (this.I === 1 /* Render */) {
997
+ this.i.notify(
998
+ this,
999
+ 1 /* Pending */ | 2 /* Error */,
1000
+ this.f
1001
+ );
1112
1002
  }
1113
1003
  }
1114
- } else
1115
- this.a !== STATE_CLEAN && runTop(this);
1116
- }
1117
- };
1118
- var TrackedEffect = class extends Computation {
1119
- s = EFFECT_USER;
1120
- w;
1121
- constructor(compute2, options) {
1122
- super(
1123
- void 0,
1124
- () => {
1125
- this.w?.();
1126
- this.w = latest(compute2);
1127
- return void 0;
1128
- },
1129
- options
1130
- );
1131
- getQueue(this).enqueue(this.s, this.x.bind(this));
1132
- }
1133
- u(state, skipQueue) {
1134
- if (this.a >= state || skipQueue)
1135
- return;
1136
- if (this.a === STATE_CLEAN || this.d && !ActiveTransition)
1137
- getQueue(this).enqueue(this.s, this.x.bind(this));
1138
- this.a = state;
1139
- }
1140
- M() {
1141
- if (this.a === STATE_DISPOSED)
1142
- return;
1143
- this.w?.();
1144
- this.w = void 0;
1145
- getQueue(this).notify(this, ERROR_BIT | LOADING_BIT, 0);
1146
- super.M();
1147
- }
1148
- x(type) {
1149
- if (type)
1150
- this.a !== STATE_CLEAN && runTop(this);
1151
- }
1152
- };
1153
- var EagerComputation = class extends Computation {
1154
- constructor(initialValue, compute2, options) {
1155
- super(initialValue, compute2, options);
1156
- !options?.defer && this.F();
1157
- }
1158
- u(state, skipQueue) {
1159
- if (this.a >= state && !this.H)
1160
- return;
1161
- if (!skipQueue && (this.a === STATE_CLEAN || this.a === STATE_CHECK && this.H))
1162
- getQueue(this).enqueue(EFFECT_PURE, this.x.bind(this));
1163
- super.u(state, skipQueue);
1164
- }
1165
- x() {
1166
- this.a !== STATE_CLEAN && runTop(this);
1167
- }
1168
- };
1169
- var FirewallComputation = class extends Computation {
1170
- firewall = true;
1171
- constructor(compute2) {
1172
- super(void 0, compute2);
1173
- }
1174
- u(state, skipQueue) {
1175
- if (this.a >= state && !this.H)
1176
- return;
1177
- if (!skipQueue && (this.a === STATE_CLEAN || this.a === STATE_CHECK && this.H))
1178
- getQueue(this).enqueue(EFFECT_PURE, this.x.bind(this));
1179
- super.u(state, true);
1180
- this.H = !!skipQueue;
1181
- }
1182
- x() {
1183
- const prevFlags = this.g;
1184
- this.a !== STATE_CLEAN && runTop(this);
1185
- if (ActiveTransition && this.j && (this.g !== prevFlags || this.g !== this.j.flags)) {
1186
- getQueue(this).notify(this, LOADING_BIT | ERROR_BIT, this.g);
1187
- this.j.flags = this.g;
1188
- this.g = prevFlags;
1189
- }
1190
- }
1191
- };
1192
- function runTop(node) {
1193
- const ancestors = [];
1194
- for (let current = node; current !== null; current = current.l) {
1195
- if (ActiveTransition && current.f)
1196
- current = ActiveTransition.b.get(current);
1197
- if (current.a !== STATE_CLEAN) {
1198
- ancestors.push(current);
1199
1004
  }
1005
+ });
1006
+ initialized = true;
1007
+ if (node.I === 1 /* Render */) {
1008
+ node.ha = (p) => !(node.f & 2 /* Error */) ? staleValues(() => compute(p)) : compute(p);
1200
1009
  }
1201
- for (let i = ancestors.length - 1; i >= 0; i--) {
1202
- if (ancestors[i].a !== STATE_DISPOSED)
1203
- ancestors[i].F();
1010
+ !options?.defer && !(node.f & (2 /* Error */ | 1 /* Pending */)) && (node.I === 2 /* User */ ? node.i.enqueue(node.I, runEffect.bind(node)) : runEffect.call(node));
1011
+ onCleanup(() => node.L?.());
1012
+ }
1013
+ function runEffect() {
1014
+ if (!this.ea || this.b & 64 /* Disposed */)
1015
+ return;
1016
+ this.L?.();
1017
+ this.L = void 0;
1018
+ try {
1019
+ this.L = this.ta(this.g, this.oa);
1020
+ } catch (error) {
1021
+ if (!this.i.notify(this, 2 /* Error */, 2 /* Error */))
1022
+ throw error;
1023
+ } finally {
1024
+ this.oa = this.g;
1025
+ this.ea = false;
1204
1026
  }
1205
1027
  }
1206
1028
 
1207
1029
  // src/signals.ts
1208
1030
  function createSignal(first, second, third) {
1209
1031
  if (typeof first === "function") {
1210
- const node2 = new Computation(second, first, third);
1032
+ const node2 = computed(first, second, third);
1211
1033
  return [
1212
- node2.wait.bind(node2),
1213
- (v) => {
1214
- node2.F();
1215
- return node2.write(v);
1216
- }
1034
+ read.bind(null, node2),
1035
+ setSignal.bind(null, node2)
1217
1036
  ];
1218
1037
  }
1219
1038
  const o = getOwner();
1220
1039
  const needsId = o?.id != null;
1221
- const node = new Computation(
1040
+ const node = signal(
1222
1041
  first,
1223
- null,
1224
- needsId ? { id: o.getNextChildId(), ...second } : second
1042
+ needsId ? { id: getNextChildId(o), ...second } : second
1225
1043
  );
1226
- return [node.read.bind(node), node.write.bind(node)];
1227
- }
1228
- function createMemo(compute2, value, options) {
1229
- let node = new Computation(
1044
+ return [
1045
+ read.bind(null, node),
1046
+ setSignal.bind(null, node)
1047
+ ];
1048
+ }
1049
+ function createMemo(compute, value, options) {
1050
+ let node = computed(compute, value, options);
1051
+ return read.bind(null, node);
1052
+ }
1053
+ function createAsync(compute, value, options) {
1054
+ const node = asyncComputed(compute, value, options);
1055
+ const ret = read.bind(null, node);
1056
+ ret.refresh = node.sa;
1057
+ return ret;
1058
+ }
1059
+ function createEffect(compute, effectFn, value, options) {
1060
+ void effect(
1061
+ compute,
1062
+ effectFn.effect || effectFn,
1063
+ effectFn.error,
1230
1064
  value,
1231
- compute2,
1232
1065
  options
1233
1066
  );
1234
- let resolvedValue;
1235
- return () => {
1236
- if (node) {
1237
- if (node.a === STATE_DISPOSED) {
1238
- node = void 0;
1239
- return resolvedValue;
1240
- }
1241
- resolvedValue = node.wait();
1242
- if (!node.b?.length && node.n?.l !== node && !(node.g & UNINITIALIZED_BIT)) {
1243
- node.dispose();
1244
- node = void 0;
1245
- }
1246
- }
1247
- return resolvedValue;
1248
- };
1249
1067
  }
1250
- function createAsync(compute2, value, options) {
1251
- let refreshing = false;
1252
- const node = new EagerComputation(
1253
- value,
1254
- (p) => {
1255
- const source = compute2(p, refreshing);
1256
- refreshing = false;
1257
- const isPromise = source instanceof Promise;
1258
- const iterator = source[Symbol.asyncIterator];
1259
- if (!isPromise && !iterator) {
1260
- return source;
1261
- }
1262
- let abort = false;
1263
- onCleanup(() => abort = true);
1264
- let transition2 = ActiveTransition;
1265
- if (isPromise) {
1266
- source.then(
1267
- (value3) => {
1268
- if (abort)
1269
- return;
1270
- if (transition2)
1271
- return transition2.runTransition(() => {
1272
- node.write(value3, 0, true);
1273
- }, true);
1274
- node.write(value3, 0, true);
1275
- },
1276
- (error) => {
1277
- if (abort)
1278
- return;
1279
- if (transition2)
1280
- return transition2.runTransition(() => node.N(error), true);
1281
- node.N(error);
1282
- }
1283
- );
1284
- } else {
1285
- (async () => {
1286
- try {
1287
- for await (let value3 of source) {
1288
- if (abort)
1289
- return;
1290
- if (transition2)
1291
- return transition2.runTransition(() => {
1292
- node.write(value3, 0, true);
1293
- transition2 = null;
1294
- }, true);
1295
- node.write(value3, 0, true);
1296
- }
1297
- } catch (error) {
1298
- if (abort)
1299
- return;
1300
- if (transition2)
1301
- return transition2.runTransition(() => {
1302
- node.N(error);
1303
- transition2 = null;
1304
- }, true);
1305
- node.N(error);
1306
- }
1307
- })();
1308
- }
1309
- throw new NotReadyError(getOwner());
1310
- },
1311
- options
1312
- );
1313
- const read = node.wait.bind(node);
1314
- read.refresh = () => {
1315
- let n = node;
1316
- if (ActiveTransition && !node.d) {
1317
- n = cloneGraph(node);
1318
- }
1319
- n.a = STATE_DIRTY;
1320
- refreshing = true;
1321
- n.F();
1322
- };
1323
- return read;
1324
- }
1325
- function createEffect(compute2, effect, value, options) {
1326
- void new Effect(
1327
- value,
1328
- compute2,
1329
- effect.effect || effect,
1330
- effect.error,
1331
- options
1332
- );
1333
- }
1334
- function createRenderEffect(compute2, effect, value, options) {
1335
- void new Effect(value, compute2, effect, void 0, {
1068
+ function createRenderEffect(compute, effectFn, value, options) {
1069
+ void effect(compute, effectFn, void 0, value, {
1336
1070
  render: true,
1337
1071
  ...options
1338
1072
  });
1339
1073
  }
1340
- function createTrackedEffect(compute2, options) {
1341
- void new TrackedEffect(compute2, options);
1342
- }
1343
- function createReaction(effect, options) {
1344
- let cleanup = void 0;
1345
- onCleanup(() => cleanup?.());
1346
- return (tracking) => {
1347
- const node = new Effect(
1348
- void 0,
1349
- tracking,
1350
- () => {
1351
- cleanup?.();
1352
- cleanup = (effect.effect || effect)?.();
1353
- node.dispose(true);
1354
- },
1355
- effect.error,
1356
- {
1357
- defer: true,
1358
- ...options
1359
- }
1360
- );
1361
- };
1074
+ function createTrackedEffect(compute, options) {
1362
1075
  }
1363
- function createRoot(init, options) {
1364
- const owner = new Owner(options?.id);
1365
- return compute(owner, !init.length ? init : () => init(() => owner.dispose()), null);
1366
- }
1367
- function runWithOwner(owner, run) {
1368
- return compute(owner, run, null);
1076
+ function createReaction(effect2, options) {
1369
1077
  }
1370
1078
  function resolve(fn) {
1371
1079
  return new Promise((res, rej) => {
1372
1080
  createRoot((dispose) => {
1373
- new EagerComputation(void 0, () => {
1081
+ computed(() => {
1374
1082
  try {
1375
1083
  res(fn());
1376
1084
  } catch (err) {
@@ -1384,44 +1092,9 @@ function resolve(fn) {
1384
1092
  });
1385
1093
  }
1386
1094
  function createOptimistic(first, second, third) {
1387
- const node = typeof first === "function" ? new Computation(
1388
- second,
1389
- (prev) => {
1390
- if (node.j.f) {
1391
- latest(() => first(prev));
1392
- return prev;
1393
- }
1394
- return first(prev);
1395
- },
1396
- third
1397
- ) : new Computation(first, null, second);
1398
- node.j = () => node.write(first);
1399
- function write(v) {
1400
- if (!ActiveTransition)
1401
- throw new Error("createOptimistic can only be updated inside a transition");
1402
- ActiveTransition.addOptimistic(node.j);
1403
- queueMicrotask(() => {
1404
- if (node.j.f) {
1405
- node.F();
1406
- node.write(v);
1407
- }
1408
- });
1409
- }
1410
- return [node.wait.bind(node), write];
1411
- }
1412
- function transition(fn) {
1413
- let t = new Transition(new Computation(void 0, null));
1414
- queueMicrotask(() => t.runTransition(() => fn((fn2) => t.runTransition(fn2))));
1095
+ return {};
1415
1096
  }
1416
- function useTransition() {
1417
- const [pending, setPending] = createOptimistic(false);
1418
- function start(fn) {
1419
- transition((resume) => {
1420
- setPending(true);
1421
- return fn(resume);
1422
- });
1423
- }
1424
- return [pending, start];
1097
+ function onSettled(callback) {
1425
1098
  }
1426
1099
 
1427
1100
  // src/store/reconcile.ts
@@ -1429,7 +1102,7 @@ function unwrap(value) {
1429
1102
  return value?.[$TARGET]?.[STORE_NODE] ?? value;
1430
1103
  }
1431
1104
  function getOverrideValue(value, override, nodes, key) {
1432
- return nodes && key in nodes ? nodes[key].read() : override && key in override ? override[key] : value[key];
1105
+ return nodes && key in nodes ? read(nodes[key]) : override && key in override ? override[key] : value[key];
1433
1106
  }
1434
1107
  function getAllKeys(value, override, next) {
1435
1108
  const keys = getKeys(value, override);
@@ -1463,16 +1136,16 @@ function applyState(next, state, keyFn, all) {
1463
1136
  if (start > newEnd || start > end) {
1464
1137
  for (j = start; j <= newEnd; j++) {
1465
1138
  changed = true;
1466
- target[STORE_NODE][j]?.write(wrap(next[j], target));
1139
+ target[STORE_NODE][j] && setSignal(target[STORE_NODE][j], wrap(next[j], target));
1467
1140
  }
1468
1141
  for (; j < next.length; j++) {
1469
1142
  changed = true;
1470
1143
  const wrapped = wrap(temp[j], target);
1471
- target[STORE_NODE][j]?.write(wrapped);
1144
+ target[STORE_NODE][j] && setSignal(target[STORE_NODE][j], wrapped);
1472
1145
  applyState(next[j], wrapped, keyFn, all);
1473
1146
  }
1474
- changed && target[STORE_NODE][$TRACK]?.write(void 0);
1475
- prevLength !== next.length && target[STORE_NODE].length?.write(next.length);
1147
+ changed && target[STORE_NODE][$TRACK] && setSignal(target[STORE_NODE][$TRACK], void 0);
1148
+ prevLength !== next.length && target[STORE_NODE].length && setSignal(target[STORE_NODE].length, next.length);
1476
1149
  return;
1477
1150
  }
1478
1151
  newIndicesNext = new Array(newEnd + 1);
@@ -1496,10 +1169,10 @@ function applyState(next, state, keyFn, all) {
1496
1169
  for (j = start; j < next.length; j++) {
1497
1170
  if (j in temp) {
1498
1171
  const wrapped = wrap(temp[j], target);
1499
- target[STORE_NODE][j]?.write(wrapped);
1172
+ target[STORE_NODE][j] && setSignal(target[STORE_NODE][j], wrapped);
1500
1173
  applyState(next[j], wrapped, keyFn, all);
1501
1174
  } else
1502
- target[STORE_NODE][j]?.write(wrap(next[j], target));
1175
+ target[STORE_NODE][j] && setSignal(target[STORE_NODE][j], wrap(next[j], target));
1503
1176
  }
1504
1177
  if (start < next.length)
1505
1178
  changed = true;
@@ -1511,9 +1184,9 @@ function applyState(next, state, keyFn, all) {
1511
1184
  }
1512
1185
  if (prevLength !== next.length) {
1513
1186
  changed = true;
1514
- target[STORE_NODE].length?.write(next.length);
1187
+ target[STORE_NODE].length && setSignal(target[STORE_NODE].length, next.length);
1515
1188
  }
1516
- changed && target[STORE_NODE][$TRACK]?.write(void 0);
1189
+ changed && target[STORE_NODE][$TRACK] && setSignal(target[STORE_NODE][$TRACK], void 0);
1517
1190
  return;
1518
1191
  }
1519
1192
  if (nodes) {
@@ -1527,8 +1200,8 @@ function applyState(next, state, keyFn, all) {
1527
1200
  if (previousValue === nextValue)
1528
1201
  continue;
1529
1202
  if (!previousValue || !isWrappable(previousValue) || keyFn(previousValue) != null && keyFn(previousValue) !== keyFn(nextValue)) {
1530
- tracked?.write(void 0);
1531
- node?.write(isWrappable(nextValue) ? wrap(nextValue, target) : nextValue);
1203
+ tracked && setSignal(tracked, void 0);
1204
+ node && setSignal(node, isWrappable(nextValue) ? wrap(nextValue, target) : nextValue);
1532
1205
  } else
1533
1206
  applyState(nextValue, wrap(previousValue, target), keyFn, all);
1534
1207
  }
@@ -1536,7 +1209,8 @@ function applyState(next, state, keyFn, all) {
1536
1209
  if (nodes = target[STORE_HAS]) {
1537
1210
  const keys = Object.keys(nodes);
1538
1211
  for (let i = 0, len = keys.length; i < len; i++) {
1539
- nodes[keys[i]].write(keys[i] in next);
1212
+ const key = keys[i];
1213
+ setSignal(nodes[key], key in next);
1540
1214
  }
1541
1215
  }
1542
1216
  }
@@ -1554,13 +1228,14 @@ function reconcile(value, key, all = false) {
1554
1228
 
1555
1229
  // src/store/projection.ts
1556
1230
  function createProjectionInternal(fn, initialValue = {}, options) {
1231
+ let node;
1557
1232
  const wrappedMap = /* @__PURE__ */ new WeakMap();
1558
1233
  const traps = {
1559
1234
  ...storeTraps,
1560
1235
  get(target, property, receiver) {
1561
1236
  const o = getOwner();
1562
- const n = getTransitionSource(node);
1563
- (!o || o !== n) && n.wait();
1237
+ const n = node;
1238
+ (!o || o !== n) && n && read(n);
1564
1239
  return storeTraps.get(target, property, receiver);
1565
1240
  }
1566
1241
  };
@@ -1577,7 +1252,7 @@ function createProjectionInternal(fn, initialValue = {}, options) {
1577
1252
  return wrapped;
1578
1253
  };
1579
1254
  const wrappedStore = wrapProjection(initialValue);
1580
- const node = new FirewallComputation(() => {
1255
+ node = computed(() => {
1581
1256
  storeSetter(wrappedStore, (s) => {
1582
1257
  const value = fn(s);
1583
1258
  if (value !== s && value !== void 0) {
@@ -1635,7 +1310,7 @@ function getNodes(target, type) {
1635
1310
  function getNode(nodes, property, value, equals = isEqual) {
1636
1311
  if (nodes[property])
1637
1312
  return nodes[property];
1638
- return nodes[property] = new Computation(value, null, {
1313
+ return nodes[property] = signal(value, {
1639
1314
  equals,
1640
1315
  unobserved() {
1641
1316
  delete nodes[property];
@@ -1643,7 +1318,7 @@ function getNode(nodes, property, value, equals = isEqual) {
1643
1318
  });
1644
1319
  }
1645
1320
  function trackSelf(target, symbol = $TRACK) {
1646
- getObserver() && getNode(getNodes(target, STORE_NODE), symbol, void 0, false).read();
1321
+ getObserver() && read(getNode(getNodes(target, STORE_NODE), symbol, void 0, false));
1647
1322
  }
1648
1323
  function getKeys(source, override, enumerable = true) {
1649
1324
  const baseKeys = untrack(() => enumerable ? Object.keys(source) : Reflect.ownKeys(source));
@@ -1691,7 +1366,7 @@ var storeTraps = {
1691
1366
  return desc.get.call(receiver);
1692
1367
  }
1693
1368
  if (Writing?.has(receiver)) {
1694
- let value2 = tracked && (overridden || !proxySource) ? tracked.m : storeValue[property];
1369
+ let value2 = tracked && (overridden || !proxySource) ? tracked.d !== NOT_PENDING ? tracked.d : tracked.g : storeValue[property];
1695
1370
  value2 === $DELETED && (value2 = void 0);
1696
1371
  if (!isWrappable(value2))
1697
1372
  return value2;
@@ -1699,14 +1374,14 @@ var storeTraps = {
1699
1374
  Writing.add(wrapped);
1700
1375
  return wrapped;
1701
1376
  }
1702
- let value = tracked ? overridden || !proxySource ? nodes[property].read() : (nodes[property].read(), storeValue[property]) : storeValue[property];
1377
+ let value = tracked ? overridden || !proxySource ? read(nodes[property]) : (read(nodes[property]), storeValue[property]) : storeValue[property];
1703
1378
  value === $DELETED && (value = void 0);
1704
1379
  if (!tracked) {
1705
1380
  if (!overridden && typeof value === "function" && !storeValue.hasOwnProperty(property)) {
1706
1381
  let proto;
1707
1382
  return !Array.isArray(target[STORE_VALUE]) && (proto = Object.getPrototypeOf(target[STORE_VALUE])) && proto !== Object.prototype ? value.bind(storeValue) : value;
1708
1383
  } else if (getObserver()) {
1709
- return getNode(nodes, property, isWrappable(value) ? wrap(value, target) : value).read();
1384
+ return read(getNode(nodes, property, isWrappable(value) ? wrap(value, target) : value));
1710
1385
  }
1711
1386
  }
1712
1387
  return isWrappable(value) ? wrap(value, target) : value;
@@ -1715,7 +1390,7 @@ var storeTraps = {
1715
1390
  if (property === $PROXY || property === $TRACK || property === "__proto__")
1716
1391
  return true;
1717
1392
  const has = target[STORE_OVERRIDE] && property in target[STORE_OVERRIDE] ? target[STORE_OVERRIDE][property] !== $DELETED : property in target[STORE_VALUE];
1718
- getObserver() && getNode(getNodes(target, STORE_HAS), property, has).read();
1393
+ getObserver() && read(getNode(getNodes(target, STORE_HAS), property, has));
1719
1394
  return has;
1720
1395
  },
1721
1396
  set(target, property, rawValue) {
@@ -1740,15 +1415,15 @@ var storeTraps = {
1740
1415
  }
1741
1416
  if (recursivelyNotify(store, storeLookup) && wrappable)
1742
1417
  recursivelyAddParent(value, store);
1743
- target[STORE_HAS]?.[property]?.write(true);
1418
+ target[STORE_HAS]?.[property] && setSignal(target[STORE_HAS][property], true);
1744
1419
  const nodes = getNodes(target, STORE_NODE);
1745
- nodes[property]?.write(wrappable ? wrap(value, target) : value);
1420
+ nodes[property] && setSignal(nodes[property], () => wrappable ? wrap(value, target) : value);
1746
1421
  if (Array.isArray(state)) {
1747
1422
  const index = parseInt(property) + 1;
1748
1423
  if (index > len)
1749
- nodes.length?.write(index);
1424
+ nodes.length && setSignal(nodes.length, index);
1750
1425
  }
1751
- nodes[$TRACK]?.write(void 0);
1426
+ nodes[$TRACK] && setSignal(nodes[$TRACK], void 0);
1752
1427
  });
1753
1428
  }
1754
1429
  return true;
@@ -1767,10 +1442,11 @@ var storeTraps = {
1767
1442
  const parents = PARENTS.get(prev);
1768
1443
  parents && (parents instanceof Set ? parents.delete(target) : PARENTS.delete(prev));
1769
1444
  }
1770
- target[STORE_HAS]?.[property]?.write(false);
1445
+ if (target[STORE_HAS]?.[property])
1446
+ setSignal(target[STORE_HAS][property], false);
1771
1447
  const nodes = getNodes(target, STORE_NODE);
1772
- nodes[property]?.write(void 0);
1773
- nodes[$TRACK]?.write(void 0);
1448
+ nodes[property] && setSignal(nodes[property], void 0);
1449
+ nodes[$TRACK] && setSignal(nodes[$TRACK], void 0);
1774
1450
  });
1775
1451
  }
1776
1452
  return true;
@@ -1824,7 +1500,7 @@ function recursivelyNotify(state, lookup) {
1824
1500
  if (target) {
1825
1501
  const deep2 = getNodes(target, STORE_NODE)[$DEEP];
1826
1502
  if (deep2) {
1827
- deep2.write(void 0);
1503
+ setSignal(deep2, void 0);
1828
1504
  notified = true;
1829
1505
  }
1830
1506
  lookup = target[STORE_LOOKUP] || lookup;
@@ -1881,31 +1557,7 @@ function deep(store) {
1881
1557
 
1882
1558
  // src/store/optimistic.ts
1883
1559
  function createOptimisticStore(first, second, options) {
1884
- const derived = typeof first === "function";
1885
- const { store, node } = derived ? createProjectionInternal(
1886
- (draft) => {
1887
- if (reset.f) {
1888
- latest(() => first(draft));
1889
- return draft;
1890
- }
1891
- return first(draft);
1892
- },
1893
- second,
1894
- options
1895
- ) : createProjectionInternal(() => {
1896
- }, first);
1897
- const reset = () => storeSetter(
1898
- store,
1899
- reconcile(derived ? first(store) || store : first, options?.key || "id", options?.all)
1900
- );
1901
- const write = (v) => {
1902
- if (!ActiveTransition)
1903
- throw new Error("createOptimisticStore can only be updated inside a transition");
1904
- ActiveTransition.addOptimistic(reset);
1905
- queueMicrotask(() => reset.f && storeSetter(store, v));
1906
- };
1907
- node.j = reset;
1908
- return [store, write];
1560
+ return [];
1909
1561
  }
1910
1562
 
1911
1563
  // src/store/utils.ts
@@ -2111,347 +1763,333 @@ function omit(props, ...keys) {
2111
1763
  // src/map.ts
2112
1764
  function mapArray(list, map, options) {
2113
1765
  const keyFn = typeof options?.keyed === "function" ? options.keyed : void 0;
2114
- return updateKeyedMap.bind({
2115
- U: new Owner(),
2116
- p: 0,
2117
- ka: list,
2118
- I: [],
2119
- R: map,
2120
- k: [],
2121
- e: [],
2122
- S: keyFn,
2123
- q: keyFn || options?.keyed === false ? [] : void 0,
2124
- r: map.length > 1 ? [] : void 0,
2125
- V: options?.fallback
2126
- });
1766
+ return createMemo(
1767
+ updateKeyedMap.bind({
1768
+ z: createOwner(),
1769
+ j: 0,
1770
+ ua: list,
1771
+ F: [],
1772
+ M: map,
1773
+ c: [],
1774
+ a: [],
1775
+ N: keyFn,
1776
+ k: keyFn || options?.keyed === false ? [] : void 0,
1777
+ l: map.length > 1 ? [] : void 0,
1778
+ X: options?.fallback
1779
+ })
1780
+ );
2127
1781
  }
2128
1782
  var pureOptions = { pureWrite: true };
2129
1783
  function updateKeyedMap() {
2130
- const newItems = this.ka() || [], newLen = newItems.length;
1784
+ const newItems = this.ua() || [], newLen = newItems.length;
2131
1785
  newItems[$TRACK];
2132
- runWithOwner(this.U, () => {
2133
- let i, j, mapper = this.q ? () => {
2134
- this.q[j] = new Computation(newItems[j], null, pureOptions);
2135
- this.r && (this.r[j] = new Computation(j, null, pureOptions));
2136
- return this.R(
2137
- Computation.prototype.read.bind(this.q[j]),
2138
- this.r ? Computation.prototype.read.bind(this.r[j]) : void 0
1786
+ runWithOwner(this.z, () => {
1787
+ let i, j, mapper = this.k ? () => {
1788
+ this.k[j] = signal(newItems[j], pureOptions);
1789
+ this.l && (this.l[j] = signal(j, pureOptions));
1790
+ return this.M(
1791
+ read.bind(null, this.k[j]),
1792
+ this.l ? read.bind(null, this.l[j]) : void 0
2139
1793
  );
2140
- } : this.r ? () => {
1794
+ } : this.l ? () => {
2141
1795
  const item = newItems[j];
2142
- this.r[j] = new Computation(j, null, pureOptions);
2143
- return this.R(() => item, Computation.prototype.read.bind(this.r[j]));
1796
+ this.l[j] = signal(j, pureOptions);
1797
+ return this.M(
1798
+ () => item,
1799
+ read.bind(null, this.l[j])
1800
+ );
2144
1801
  } : () => {
2145
1802
  const item = newItems[j];
2146
- return this.R(() => item);
1803
+ return this.M(() => item);
2147
1804
  };
2148
1805
  if (newLen === 0) {
2149
- if (this.p !== 0) {
2150
- this.U.dispose(false);
2151
- this.e = [];
2152
- this.I = [];
2153
- this.k = [];
2154
- this.p = 0;
2155
- this.q && (this.q = []);
2156
- this.r && (this.r = []);
1806
+ if (this.j !== 0) {
1807
+ this.z.dispose(false);
1808
+ this.a = [];
1809
+ this.F = [];
1810
+ this.c = [];
1811
+ this.j = 0;
1812
+ this.k && (this.k = []);
1813
+ this.l && (this.l = []);
2157
1814
  }
2158
- if (this.V && !this.k[0]) {
2159
- this.k[0] = compute(
2160
- this.e[0] = new Owner(),
2161
- this.V,
2162
- null
1815
+ if (this.X && !this.c[0]) {
1816
+ this.c[0] = runWithOwner(
1817
+ this.a[0] = createOwner(),
1818
+ this.X
2163
1819
  );
2164
1820
  }
2165
- } else if (this.p === 0) {
2166
- if (this.e[0])
2167
- this.e[0].dispose();
2168
- this.k = new Array(newLen);
1821
+ } else if (this.j === 0) {
1822
+ if (this.a[0])
1823
+ this.a[0].dispose();
1824
+ this.c = new Array(newLen);
2169
1825
  for (j = 0; j < newLen; j++) {
2170
- this.I[j] = newItems[j];
2171
- this.k[j] = compute(this.e[j] = new Owner(), mapper, null);
1826
+ this.F[j] = newItems[j];
1827
+ this.c[j] = runWithOwner(this.a[j] = createOwner(), mapper);
2172
1828
  }
2173
- this.p = newLen;
1829
+ this.j = newLen;
2174
1830
  } else {
2175
- let start, end, newEnd, item, key, newIndices, newIndicesNext, temp = new Array(newLen), tempNodes = new Array(newLen), tempRows = this.q ? new Array(newLen) : void 0, tempIndexes = this.r ? new Array(newLen) : void 0;
2176
- for (start = 0, end = Math.min(this.p, newLen); start < end && (this.I[start] === newItems[start] || this.q && compare(this.S, this.I[start], newItems[start])); start++) {
2177
- if (this.q)
2178
- this.q[start].write(newItems[start]);
1831
+ let start, end, newEnd, item, key, newIndices, newIndicesNext, temp = new Array(newLen), tempNodes = new Array(newLen), tempRows = this.k ? new Array(newLen) : void 0, tempIndexes = this.l ? new Array(newLen) : void 0;
1832
+ for (start = 0, end = Math.min(this.j, newLen); start < end && (this.F[start] === newItems[start] || this.k && compare(this.N, this.F[start], newItems[start])); start++) {
1833
+ if (this.k)
1834
+ setSignal(this.k[start], newItems[start]);
2179
1835
  }
2180
- for (end = this.p - 1, newEnd = newLen - 1; end >= start && newEnd >= start && (this.I[end] === newItems[newEnd] || this.q && compare(this.S, this.I[end], newItems[newEnd])); end--, newEnd--) {
2181
- temp[newEnd] = this.k[end];
2182
- tempNodes[newEnd] = this.e[end];
2183
- tempRows && (tempRows[newEnd] = this.q[end]);
2184
- tempIndexes && (tempIndexes[newEnd] = this.r[end]);
1836
+ for (end = this.j - 1, newEnd = newLen - 1; end >= start && newEnd >= start && (this.F[end] === newItems[newEnd] || this.k && compare(this.N, this.F[end], newItems[newEnd])); end--, newEnd--) {
1837
+ temp[newEnd] = this.c[end];
1838
+ tempNodes[newEnd] = this.a[end];
1839
+ tempRows && (tempRows[newEnd] = this.k[end]);
1840
+ tempIndexes && (tempIndexes[newEnd] = this.l[end]);
2185
1841
  }
2186
1842
  newIndices = /* @__PURE__ */ new Map();
2187
1843
  newIndicesNext = new Array(newEnd + 1);
2188
1844
  for (j = newEnd; j >= start; j--) {
2189
1845
  item = newItems[j];
2190
- key = this.S ? this.S(item) : item;
1846
+ key = this.N ? this.N(item) : item;
2191
1847
  i = newIndices.get(key);
2192
1848
  newIndicesNext[j] = i === void 0 ? -1 : i;
2193
1849
  newIndices.set(key, j);
2194
1850
  }
2195
1851
  for (i = start; i <= end; i++) {
2196
- item = this.I[i];
2197
- key = this.S ? this.S(item) : item;
1852
+ item = this.F[i];
1853
+ key = this.N ? this.N(item) : item;
2198
1854
  j = newIndices.get(key);
2199
1855
  if (j !== void 0 && j !== -1) {
2200
- temp[j] = this.k[i];
2201
- tempNodes[j] = this.e[i];
2202
- tempRows && (tempRows[j] = this.q[i]);
2203
- tempIndexes && (tempIndexes[j] = this.r[i]);
1856
+ temp[j] = this.c[i];
1857
+ tempNodes[j] = this.a[i];
1858
+ tempRows && (tempRows[j] = this.k[i]);
1859
+ tempIndexes && (tempIndexes[j] = this.l[i]);
2204
1860
  j = newIndicesNext[j];
2205
1861
  newIndices.set(key, j);
2206
1862
  } else
2207
- this.e[i].dispose();
1863
+ this.a[i].dispose();
2208
1864
  }
2209
1865
  for (j = start; j < newLen; j++) {
2210
1866
  if (j in temp) {
2211
- this.k[j] = temp[j];
2212
- this.e[j] = tempNodes[j];
1867
+ this.c[j] = temp[j];
1868
+ this.a[j] = tempNodes[j];
2213
1869
  if (tempRows) {
2214
- this.q[j] = tempRows[j];
2215
- this.q[j].write(newItems[j]);
1870
+ this.k[j] = tempRows[j];
1871
+ setSignal(this.k[j], newItems[j]);
2216
1872
  }
2217
1873
  if (tempIndexes) {
2218
- this.r[j] = tempIndexes[j];
2219
- this.r[j].write(j);
1874
+ this.l[j] = tempIndexes[j];
1875
+ setSignal(this.l[j], j);
2220
1876
  }
2221
1877
  } else {
2222
- this.k[j] = compute(this.e[j] = new Owner(), mapper, null);
1878
+ this.c[j] = runWithOwner(this.a[j] = createOwner(), mapper);
2223
1879
  }
2224
1880
  }
2225
- this.k = this.k.slice(0, this.p = newLen);
2226
- this.I = newItems.slice(0);
1881
+ this.c = this.c.slice(0, this.j = newLen);
1882
+ this.F = newItems.slice(0);
2227
1883
  }
2228
1884
  });
2229
- return this.k;
1885
+ return this.c;
2230
1886
  }
2231
1887
  function repeat(count, map, options) {
2232
1888
  return updateRepeat.bind({
2233
- U: new Owner(),
2234
- p: 0,
2235
- B: 0,
2236
- la: count,
2237
- R: map,
2238
- e: [],
2239
- k: [],
2240
- ma: options?.from,
2241
- V: options?.fallback
1889
+ z: createOwner(),
1890
+ j: 0,
1891
+ w: 0,
1892
+ va: count,
1893
+ M: map,
1894
+ a: [],
1895
+ c: [],
1896
+ wa: options?.from,
1897
+ X: options?.fallback
2242
1898
  });
2243
1899
  }
2244
1900
  function updateRepeat() {
2245
- const newLen = this.la();
2246
- const from = this.ma?.() || 0;
2247
- runWithOwner(this.U, () => {
1901
+ const newLen = this.va();
1902
+ const from = this.wa?.() || 0;
1903
+ runWithOwner(this.z, () => {
2248
1904
  if (newLen === 0) {
2249
- if (this.p !== 0) {
2250
- this.U.dispose(false);
2251
- this.e = [];
2252
- this.k = [];
2253
- this.p = 0;
1905
+ if (this.j !== 0) {
1906
+ this.z.dispose(false);
1907
+ this.a = [];
1908
+ this.c = [];
1909
+ this.j = 0;
2254
1910
  }
2255
- if (this.V && !this.k[0]) {
2256
- this.k[0] = compute(
2257
- this.e[0] = new Owner(),
2258
- this.V,
2259
- null
1911
+ if (this.X && !this.c[0]) {
1912
+ this.c[0] = runWithOwner(
1913
+ this.a[0] = createOwner(),
1914
+ this.X
2260
1915
  );
2261
1916
  }
2262
1917
  return;
2263
1918
  }
2264
1919
  const to = from + newLen;
2265
- const prevTo = this.B + this.p;
2266
- if (this.p === 0 && this.e[0])
2267
- this.e[0].dispose();
1920
+ const prevTo = this.w + this.j;
1921
+ if (this.j === 0 && this.a[0])
1922
+ this.a[0].dispose();
2268
1923
  for (let i = to; i < prevTo; i++)
2269
- this.e[i - this.B].dispose();
2270
- if (this.B < from) {
2271
- let i = this.B;
2272
- while (i < from && i < this.p)
2273
- this.e[i++].dispose();
2274
- this.e.splice(0, from - this.B);
2275
- this.k.splice(0, from - this.B);
2276
- } else if (this.B > from) {
2277
- let i = prevTo - this.B - 1;
2278
- let difference = this.B - from;
2279
- this.e.length = this.k.length = newLen;
1924
+ this.a[i - this.w].dispose();
1925
+ if (this.w < from) {
1926
+ let i = this.w;
1927
+ while (i < from && i < this.j)
1928
+ this.a[i++].dispose();
1929
+ this.a.splice(0, from - this.w);
1930
+ this.c.splice(0, from - this.w);
1931
+ } else if (this.w > from) {
1932
+ let i = prevTo - this.w - 1;
1933
+ let difference = this.w - from;
1934
+ this.a.length = this.c.length = newLen;
2280
1935
  while (i >= difference) {
2281
- this.e[i] = this.e[i - difference];
2282
- this.k[i] = this.k[i - difference];
1936
+ this.a[i] = this.a[i - difference];
1937
+ this.c[i] = this.c[i - difference];
2283
1938
  i--;
2284
1939
  }
2285
1940
  for (let i2 = 0; i2 < difference; i2++) {
2286
- this.k[i2] = compute(
2287
- this.e[i2] = new Owner(),
2288
- () => this.R(i2 + from),
2289
- null
1941
+ this.c[i2] = runWithOwner(
1942
+ this.a[i2] = createOwner(),
1943
+ () => this.M(i2 + from)
2290
1944
  );
2291
1945
  }
2292
1946
  }
2293
1947
  for (let i = prevTo; i < to; i++) {
2294
- this.k[i - from] = compute(
2295
- this.e[i - from] = new Owner(),
2296
- () => this.R(i),
2297
- null
1948
+ this.c[i - from] = runWithOwner(
1949
+ this.a[i - from] = createOwner(),
1950
+ () => this.M(i)
2298
1951
  );
2299
1952
  }
2300
- this.k = this.k.slice(0, newLen);
2301
- this.B = from;
2302
- this.p = newLen;
1953
+ this.c = this.c.slice(0, newLen);
1954
+ this.w = from;
1955
+ this.j = newLen;
2303
1956
  });
2304
- return this.k;
1957
+ return this.c;
2305
1958
  }
2306
1959
  function compare(key, a, b) {
2307
1960
  return key ? key(a) === key(b) : true;
2308
1961
  }
2309
1962
 
2310
1963
  // src/boundaries.ts
2311
- var BoundaryComputation = class extends EagerComputation {
2312
- W;
2313
- constructor(compute2, propagationMask) {
2314
- super(void 0, compute2, { defer: true });
2315
- this.W = propagationMask;
2316
- }
2317
- write(value, flags) {
2318
- super.write(value, flags & ~this.W);
2319
- if (this.W & LOADING_BIT && !(this.g & UNINITIALIZED_BIT || ActiveTransition)) {
2320
- flags &= ~LOADING_BIT;
1964
+ function boundaryComputed(fn, propagationMask) {
1965
+ const node = computed(fn, void 0, {
1966
+ ja: {
1967
+ la() {
1968
+ let flags = this.f;
1969
+ this.f &= ~this.Y;
1970
+ if (this.Y & 1 /* Pending */ && !(this.f & 4 /* Uninitialized */)) {
1971
+ flags &= ~1 /* Pending */;
1972
+ }
1973
+ this.i.notify(this, this.Y, flags);
1974
+ },
1975
+ Y: propagationMask
2321
1976
  }
2322
- getQueue(this).notify(this, this.W, flags);
2323
- return this.m;
2324
- }
2325
- };
1977
+ });
1978
+ node.Y = propagationMask;
1979
+ return node;
1980
+ }
2326
1981
  function createBoundChildren(owner, fn, queue, mask) {
2327
- const parentQueue = owner.E;
2328
- parentQueue.addChild(owner.E = queue);
2329
- onCleanup(() => parentQueue.removeChild(owner.E));
2330
- return compute(
2331
- owner,
2332
- () => {
2333
- const c = new Computation(void 0, fn);
2334
- return new BoundaryComputation(() => latest(() => flatten(c.wait())), mask);
2335
- },
2336
- null
2337
- );
1982
+ const parentQueue = owner.i;
1983
+ parentQueue.addChild(owner.i = queue);
1984
+ onCleanup(() => parentQueue.removeChild(owner.i));
1985
+ return runWithOwner(owner, () => {
1986
+ const c = computed(fn);
1987
+ return boundaryComputed(() => staleValues(() => flatten(read(c))), mask);
1988
+ });
2338
1989
  }
2339
1990
  var ConditionalQueue = class extends Queue {
2340
- y;
2341
- X = /* @__PURE__ */ new Set();
2342
- t = /* @__PURE__ */ new Set();
1991
+ r;
1992
+ fa = /* @__PURE__ */ new Set();
1993
+ h = /* @__PURE__ */ new Set();
2343
1994
  constructor(disabled) {
2344
1995
  super();
2345
- this.y = disabled;
1996
+ this.r = disabled;
2346
1997
  }
2347
1998
  run(type) {
2348
- if (!type || this.y.read())
1999
+ if (!type || read(this.r))
2349
2000
  return;
2350
2001
  return super.run(type);
2351
2002
  }
2352
2003
  notify(node, type, flags) {
2353
- if (this.y.read()) {
2354
- if (type & LOADING_BIT) {
2355
- if (flags & LOADING_BIT) {
2356
- this.t.add(node);
2357
- type &= ~LOADING_BIT;
2358
- } else if (this.t.delete(node))
2359
- type &= ~LOADING_BIT;
2004
+ if (read(this.r)) {
2005
+ if (type & 1 /* Pending */) {
2006
+ if (flags & 1 /* Pending */) {
2007
+ this.h.add(node);
2008
+ type &= ~1 /* Pending */;
2009
+ } else if (this.h.delete(node))
2010
+ type &= ~1 /* Pending */;
2360
2011
  }
2361
- if (type & ERROR_BIT) {
2362
- if (flags & ERROR_BIT) {
2363
- this.X.add(node);
2364
- type &= ~ERROR_BIT;
2365
- } else if (this.X.delete(node))
2366
- type &= ~ERROR_BIT;
2012
+ if (type & 2 /* Error */) {
2013
+ if (flags & 2 /* Error */) {
2014
+ this.fa.add(node);
2015
+ type &= ~2 /* Error */;
2016
+ } else if (this.fa.delete(node))
2017
+ type &= ~2 /* Error */;
2367
2018
  }
2368
2019
  }
2369
2020
  return type ? super.notify(node, type, flags) : true;
2370
2021
  }
2371
- merge(queue) {
2372
- queue.t.forEach((n) => this.notify(n, LOADING_BIT, LOADING_BIT));
2373
- queue.X.forEach((n) => this.notify(n, ERROR_BIT, ERROR_BIT));
2374
- super.merge(queue);
2375
- }
2376
2022
  };
2377
2023
  var CollectionQueue = class extends Queue {
2378
- L;
2379
- e = /* @__PURE__ */ new Set();
2380
- y = new Computation(false, null, { pureWrite: true });
2024
+ ga;
2025
+ a = /* @__PURE__ */ new Set();
2026
+ r = signal(false, { pureWrite: true });
2381
2027
  constructor(type) {
2382
2028
  super();
2383
- this.L = type;
2029
+ this.ga = type;
2384
2030
  }
2385
2031
  run(type) {
2386
- if (!type || this.y.read())
2032
+ if (!type || read(this.r))
2387
2033
  return;
2388
2034
  return super.run(type);
2389
2035
  }
2390
2036
  notify(node, type, flags) {
2391
- if (!(type & this.L))
2037
+ if (!(type & this.ga))
2392
2038
  return super.notify(node, type, flags);
2393
- if (flags & this.L) {
2394
- this.e.add(node);
2395
- if (this.e.size === 1)
2396
- this.y.write(true);
2397
- } else if (this.e.size > 0) {
2398
- this.e.delete(node);
2399
- if (this.e.size === 0)
2400
- this.y.write(false);
2401
- }
2402
- type &= ~this.L;
2039
+ if (flags & this.ga) {
2040
+ this.a.add(node);
2041
+ if (this.a.size === 1)
2042
+ setSignal(this.r, true);
2043
+ } else if (this.a.size > 0) {
2044
+ this.a.delete(node);
2045
+ if (this.a.size === 0)
2046
+ setSignal(this.r, false);
2047
+ }
2048
+ type &= ~this.ga;
2403
2049
  return type ? super.notify(node, type, flags) : true;
2404
2050
  }
2405
- merge(queue) {
2406
- queue.e.forEach((n) => this.notify(n, this.L, this.L));
2407
- super.merge(queue);
2408
- }
2409
2051
  };
2410
2052
  function createBoundary(fn, condition) {
2411
- const owner = new Owner();
2412
- const queue = new ConditionalQueue(
2413
- new Computation(void 0, () => condition() === "hidden" /* HIDDEN */)
2414
- );
2053
+ const owner = createOwner();
2054
+ const queue = new ConditionalQueue(computed(() => condition() === "hidden" /* HIDDEN */));
2415
2055
  const tree = createBoundChildren(owner, fn, queue, 0);
2416
- new EagerComputation(void 0, () => {
2417
- const disabled = queue.y.read();
2418
- tree.W = disabled ? ERROR_BIT | LOADING_BIT : 0;
2056
+ computed(() => {
2057
+ const disabled = read(queue.r);
2058
+ tree.Y = disabled ? 2 /* Error */ | 1 /* Pending */ : 0;
2419
2059
  if (!disabled) {
2420
- queue.t.forEach((node) => queue.notify(node, LOADING_BIT, LOADING_BIT));
2421
- queue.X.forEach((node) => queue.notify(node, ERROR_BIT, ERROR_BIT));
2422
- queue.t.clear();
2423
- queue.X.clear();
2060
+ queue.h.forEach(
2061
+ (node) => queue.notify(node, 1 /* Pending */, 1 /* Pending */)
2062
+ );
2063
+ queue.fa.forEach((node) => queue.notify(node, 2 /* Error */, 2 /* Error */));
2064
+ queue.h.clear();
2065
+ queue.fa.clear();
2424
2066
  }
2425
2067
  });
2426
- return () => queue.y.read() ? void 0 : tree.read();
2068
+ return () => read(queue.r) ? void 0 : read(tree);
2427
2069
  }
2428
2070
  function createCollectionBoundary(type, fn, fallback) {
2429
- const owner = new Owner();
2071
+ const owner = createOwner();
2430
2072
  const queue = new CollectionQueue(type);
2431
2073
  const tree = createBoundChildren(owner, fn, queue, type);
2432
- const decision = new Computation(void 0, () => {
2433
- if (!queue.y.read()) {
2434
- const resolved = tree.read();
2435
- if (!untrack(() => queue.y.read()))
2074
+ const decision = computed(() => {
2075
+ if (!read(queue.r)) {
2076
+ const resolved = read(tree);
2077
+ if (!untrack(() => read(queue.r)))
2436
2078
  return resolved;
2437
2079
  }
2438
2080
  return fallback(queue);
2439
2081
  });
2440
- return decision.read.bind(decision);
2082
+ return read.bind(null, decision);
2441
2083
  }
2442
- function createSuspense(fn, fallback) {
2443
- return createCollectionBoundary(LOADING_BIT, fn, () => fallback());
2084
+ function createLoadBoundary(fn, fallback) {
2085
+ return createCollectionBoundary(1 /* Pending */, fn, () => fallback());
2444
2086
  }
2445
2087
  function createErrorBoundary(fn, fallback) {
2446
- return createCollectionBoundary(ERROR_BIT, fn, (queue) => {
2447
- let node = getTransitionSource(queue.e.values().next().value);
2448
- return fallback(node.O, () => {
2449
- incrementClock();
2450
- for (let node2 of queue.e) {
2451
- if (ActiveTransition && !node2.d)
2452
- node2 = cloneGraph(node2);
2453
- node2.a = STATE_DIRTY;
2454
- getQueue(node2).enqueue(node2.s, node2.x.bind(node2));
2088
+ return createCollectionBoundary(2 /* Error */, fn, (queue) => {
2089
+ let node = queue.a.values().next().value;
2090
+ return fallback(node.B, () => {
2091
+ for (let node2 of queue.a) {
2092
+ recompute(node2, true);
2455
2093
  }
2456
2094
  });
2457
2095
  });
@@ -2511,4 +2149,4 @@ function flattenArray(children, results = [], options) {
2511
2149
  return needsUnwrap;
2512
2150
  }
2513
2151
 
2514
- export { $PROXY, $TARGET, $TRACK, Computation, ContextNotFoundError, NoOwnerError, NotReadyError, Owner, Queue, SUPPORTS_PROXY, createAsync, createBoundary, createContext, createEffect, createErrorBoundary, createMemo, createOptimistic, createOptimisticStore, createProjection, createReaction, createRenderEffect, createRoot, createSignal, createStore, createSuspense, createTrackedEffect, deep, flatten, flush, getContext, getObserver, getOwner, hasContext, hasUpdated, isEqual, isPending, isWrappable, latest, mapArray, merge, omit, onCleanup, reconcile, repeat, resolve, runWithOwner, setContext, snapshot, transition, untrack, useTransition };
2152
+ export { $PROXY, $TARGET, $TRACK, ContextNotFoundError, NoOwnerError, NotReadyError, SUPPORTS_PROXY, createAsync, createBoundary, createContext, createEffect, createErrorBoundary, createLoadBoundary, createMemo, createOptimistic, createOptimisticStore, createProjection, createReaction, createRenderEffect, createRoot, createSignal, createStore, createTrackedEffect, deep, flatten, flush, getContext, getNextChildId, getObserver, getOwner, isEqual, isPending, isWrappable, mapArray, merge, omit, onCleanup, onSettled, pending, reconcile, repeat, resolve, runWithOwner, setContext, snapshot, untrack };