@tanstack/store 0.8.1 → 0.9.1

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.
Files changed (64) hide show
  1. package/dist/cjs/alien.cjs +345 -0
  2. package/dist/cjs/alien.cjs.map +1 -0
  3. package/dist/cjs/alien.d.cts +57 -0
  4. package/dist/cjs/atom.cjs +222 -0
  5. package/dist/cjs/atom.cjs.map +1 -0
  6. package/dist/cjs/atom.d.cts +16 -0
  7. package/dist/cjs/batch.cjs +15 -0
  8. package/dist/cjs/batch.cjs.map +1 -0
  9. package/dist/cjs/batch.d.cts +1 -0
  10. package/dist/cjs/index.cjs +9 -12
  11. package/dist/cjs/index.cjs.map +1 -1
  12. package/dist/cjs/index.d.cts +3 -4
  13. package/dist/cjs/store.cjs +39 -29
  14. package/dist/cjs/store.cjs.map +1 -1
  15. package/dist/cjs/store.d.cts +18 -29
  16. package/dist/cjs/types.d.cts +47 -20
  17. package/dist/esm/alien.d.ts +57 -0
  18. package/dist/esm/alien.js +345 -0
  19. package/dist/esm/alien.js.map +1 -0
  20. package/dist/esm/atom.d.ts +16 -0
  21. package/dist/esm/atom.js +222 -0
  22. package/dist/esm/atom.js.map +1 -0
  23. package/dist/esm/batch.d.ts +1 -0
  24. package/dist/esm/batch.js +15 -0
  25. package/dist/esm/batch.js.map +1 -0
  26. package/dist/esm/index.d.ts +3 -4
  27. package/dist/esm/index.js +9 -12
  28. package/dist/esm/index.js.map +1 -1
  29. package/dist/esm/store.d.ts +18 -29
  30. package/dist/esm/store.js +40 -30
  31. package/dist/esm/store.js.map +1 -1
  32. package/dist/esm/types.d.ts +47 -20
  33. package/package.json +6 -7
  34. package/src/alien.ts +654 -0
  35. package/src/atom.ts +298 -0
  36. package/src/batch.ts +12 -0
  37. package/src/index.ts +3 -4
  38. package/src/store.ts +58 -69
  39. package/src/types.ts +60 -24
  40. package/dist/cjs/derived.cjs +0 -117
  41. package/dist/cjs/derived.cjs.map +0 -1
  42. package/dist/cjs/derived.d.cts +0 -50
  43. package/dist/cjs/effect.cjs +0 -24
  44. package/dist/cjs/effect.cjs.map +0 -1
  45. package/dist/cjs/effect.d.cts +0 -18
  46. package/dist/cjs/scheduler.cjs +0 -109
  47. package/dist/cjs/scheduler.cjs.map +0 -1
  48. package/dist/cjs/scheduler.d.cts +0 -27
  49. package/dist/cjs/types.cjs +0 -7
  50. package/dist/cjs/types.cjs.map +0 -1
  51. package/dist/esm/derived.d.ts +0 -50
  52. package/dist/esm/derived.js +0 -117
  53. package/dist/esm/derived.js.map +0 -1
  54. package/dist/esm/effect.d.ts +0 -18
  55. package/dist/esm/effect.js +0 -24
  56. package/dist/esm/effect.js.map +0 -1
  57. package/dist/esm/scheduler.d.ts +0 -27
  58. package/dist/esm/scheduler.js +0 -109
  59. package/dist/esm/scheduler.js.map +0 -1
  60. package/dist/esm/types.js +0 -7
  61. package/dist/esm/types.js.map +0 -1
  62. package/src/derived.ts +0 -203
  63. package/src/effect.ts +0 -42
  64. package/src/scheduler.ts +0 -155
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ var ReactiveFlags = /* @__PURE__ */ ((ReactiveFlags2) => {
4
+ ReactiveFlags2[ReactiveFlags2["None"] = 0] = "None";
5
+ ReactiveFlags2[ReactiveFlags2["Mutable"] = 1] = "Mutable";
6
+ ReactiveFlags2[ReactiveFlags2["Watching"] = 2] = "Watching";
7
+ ReactiveFlags2[ReactiveFlags2["RecursedCheck"] = 4] = "RecursedCheck";
8
+ ReactiveFlags2[ReactiveFlags2["Recursed"] = 8] = "Recursed";
9
+ ReactiveFlags2[ReactiveFlags2["Dirty"] = 16] = "Dirty";
10
+ ReactiveFlags2[ReactiveFlags2["Pending"] = 32] = "Pending";
11
+ return ReactiveFlags2;
12
+ })(ReactiveFlags || {});
13
+ function createReactiveSystem({
14
+ update,
15
+ notify,
16
+ unwatched
17
+ }) {
18
+ return {
19
+ link: link2,
20
+ unlink: unlink2,
21
+ propagate: propagate2,
22
+ checkDirty: checkDirty2,
23
+ shallowPropagate: shallowPropagate2
24
+ };
25
+ function link2(dep, sub, version) {
26
+ const prevDep = sub.depsTail;
27
+ if (prevDep !== void 0 && prevDep.dep === dep) {
28
+ return;
29
+ }
30
+ const nextDep = prevDep !== void 0 ? prevDep.nextDep : sub.deps;
31
+ if (nextDep !== void 0 && nextDep.dep === dep) {
32
+ nextDep.version = version;
33
+ sub.depsTail = nextDep;
34
+ return;
35
+ }
36
+ const prevSub = dep.subsTail;
37
+ if (prevSub !== void 0 && prevSub.version === version && prevSub.sub === sub) {
38
+ return;
39
+ }
40
+ const newLink = sub.depsTail = dep.subsTail = {
41
+ version,
42
+ dep,
43
+ sub,
44
+ prevDep,
45
+ nextDep,
46
+ prevSub,
47
+ nextSub: void 0
48
+ };
49
+ if (nextDep !== void 0) {
50
+ nextDep.prevDep = newLink;
51
+ }
52
+ if (prevDep !== void 0) {
53
+ prevDep.nextDep = newLink;
54
+ } else {
55
+ sub.deps = newLink;
56
+ }
57
+ if (prevSub !== void 0) {
58
+ prevSub.nextSub = newLink;
59
+ } else {
60
+ dep.subs = newLink;
61
+ }
62
+ }
63
+ function unlink2(link3, sub = link3.sub) {
64
+ const dep = link3.dep;
65
+ const prevDep = link3.prevDep;
66
+ const nextDep = link3.nextDep;
67
+ const nextSub = link3.nextSub;
68
+ const prevSub = link3.prevSub;
69
+ if (nextDep !== void 0) {
70
+ nextDep.prevDep = prevDep;
71
+ } else {
72
+ sub.depsTail = prevDep;
73
+ }
74
+ if (prevDep !== void 0) {
75
+ prevDep.nextDep = nextDep;
76
+ } else {
77
+ sub.deps = nextDep;
78
+ }
79
+ if (nextSub !== void 0) {
80
+ nextSub.prevSub = prevSub;
81
+ } else {
82
+ dep.subsTail = prevSub;
83
+ }
84
+ if (prevSub !== void 0) {
85
+ prevSub.nextSub = nextSub;
86
+ } else if ((dep.subs = nextSub) === void 0) {
87
+ unwatched(dep);
88
+ }
89
+ return nextDep;
90
+ }
91
+ function propagate2(link3) {
92
+ let next = link3.nextSub;
93
+ let stack;
94
+ top: do {
95
+ const sub = link3.sub;
96
+ let flags = sub.flags;
97
+ if (!(flags & (4 | 8 | 16 | 32))) {
98
+ sub.flags = flags | 32;
99
+ } else if (!(flags & (4 | 8))) {
100
+ flags = 0;
101
+ } else if (!(flags & 4)) {
102
+ sub.flags = flags & -9 | 32;
103
+ } else if (!(flags & (16 | 32)) && isValidLink(link3, sub)) {
104
+ sub.flags = flags | (8 | 32);
105
+ flags &= 1;
106
+ } else {
107
+ flags = 0;
108
+ }
109
+ if (flags & 2) {
110
+ notify(sub);
111
+ }
112
+ if (flags & 1) {
113
+ const subSubs = sub.subs;
114
+ if (subSubs !== void 0) {
115
+ const nextSub = (link3 = subSubs).nextSub;
116
+ if (nextSub !== void 0) {
117
+ stack = { value: next, prev: stack };
118
+ next = nextSub;
119
+ }
120
+ continue;
121
+ }
122
+ }
123
+ if ((link3 = next) !== void 0) {
124
+ next = link3.nextSub;
125
+ continue;
126
+ }
127
+ while (stack !== void 0) {
128
+ link3 = stack.value;
129
+ stack = stack.prev;
130
+ if (link3 !== void 0) {
131
+ next = link3.nextSub;
132
+ continue top;
133
+ }
134
+ }
135
+ break;
136
+ } while (true);
137
+ }
138
+ function checkDirty2(link3, sub) {
139
+ let stack;
140
+ let checkDepth = 0;
141
+ let dirty = false;
142
+ top: do {
143
+ const dep = link3.dep;
144
+ const flags = dep.flags;
145
+ if (sub.flags & 16) {
146
+ dirty = true;
147
+ } else if ((flags & (1 | 16)) === (1 | 16)) {
148
+ if (update(dep)) {
149
+ const subs = dep.subs;
150
+ if (subs.nextSub !== void 0) {
151
+ shallowPropagate2(subs);
152
+ }
153
+ dirty = true;
154
+ }
155
+ } else if ((flags & (1 | 32)) === (1 | 32)) {
156
+ if (link3.nextSub !== void 0 || link3.prevSub !== void 0) {
157
+ stack = { value: link3, prev: stack };
158
+ }
159
+ link3 = dep.deps;
160
+ sub = dep;
161
+ ++checkDepth;
162
+ continue;
163
+ }
164
+ if (!dirty) {
165
+ const nextDep = link3.nextDep;
166
+ if (nextDep !== void 0) {
167
+ link3 = nextDep;
168
+ continue;
169
+ }
170
+ }
171
+ while (checkDepth--) {
172
+ const firstSub = sub.subs;
173
+ const hasMultipleSubs = firstSub.nextSub !== void 0;
174
+ if (hasMultipleSubs) {
175
+ link3 = stack.value;
176
+ stack = stack.prev;
177
+ } else {
178
+ link3 = firstSub;
179
+ }
180
+ if (dirty) {
181
+ if (update(sub)) {
182
+ if (hasMultipleSubs) {
183
+ shallowPropagate2(firstSub);
184
+ }
185
+ sub = link3.sub;
186
+ continue;
187
+ }
188
+ dirty = false;
189
+ } else {
190
+ sub.flags &= -33;
191
+ }
192
+ sub = link3.sub;
193
+ const nextDep = link3.nextDep;
194
+ if (nextDep !== void 0) {
195
+ link3 = nextDep;
196
+ continue top;
197
+ }
198
+ }
199
+ return dirty;
200
+ } while (true);
201
+ }
202
+ function shallowPropagate2(link3) {
203
+ do {
204
+ const sub = link3.sub;
205
+ const flags = sub.flags;
206
+ if ((flags & (32 | 16)) === 32) {
207
+ sub.flags = flags | 16;
208
+ if ((flags & (2 | 4)) === 2) {
209
+ notify(sub);
210
+ }
211
+ }
212
+ } while ((link3 = link3.nextSub) !== void 0);
213
+ }
214
+ function isValidLink(checkLink, sub) {
215
+ let link3 = sub.depsTail;
216
+ while (link3 !== void 0) {
217
+ if (link3 === checkLink) {
218
+ return true;
219
+ }
220
+ link3 = link3.prevDep;
221
+ }
222
+ return false;
223
+ }
224
+ }
225
+ let batchDepth = 0;
226
+ let notifyIndex = 0;
227
+ let queuedLength = 0;
228
+ const queued = [];
229
+ const { link, unlink, propagate, checkDirty, shallowPropagate } = createReactiveSystem({
230
+ update(node) {
231
+ if (node.depsTail !== void 0) {
232
+ return updateComputed(node);
233
+ } else {
234
+ return updateSignal(node);
235
+ }
236
+ },
237
+ notify(effect2) {
238
+ let insertIndex = queuedLength;
239
+ let firstInsertedIndex = insertIndex;
240
+ do {
241
+ queued[insertIndex++] = effect2;
242
+ effect2.flags &= -3;
243
+ effect2 = effect2.subs?.sub;
244
+ if (effect2 === void 0 || !(effect2.flags & 2)) {
245
+ break;
246
+ }
247
+ } while (true);
248
+ queuedLength = insertIndex;
249
+ while (firstInsertedIndex < --insertIndex) {
250
+ const left = queued[firstInsertedIndex];
251
+ queued[firstInsertedIndex++] = queued[insertIndex];
252
+ queued[insertIndex] = left;
253
+ }
254
+ },
255
+ unwatched(node) {
256
+ if (!(node.flags & 1)) {
257
+ effectScopeOper.call(node);
258
+ } else if (node.depsTail !== void 0) {
259
+ node.depsTail = void 0;
260
+ node.flags = 1 | 16;
261
+ purgeDeps(node);
262
+ }
263
+ }
264
+ });
265
+ function getBatchDepth() {
266
+ return batchDepth;
267
+ }
268
+ function startBatch() {
269
+ ++batchDepth;
270
+ }
271
+ function endBatch() {
272
+ if (!--batchDepth) {
273
+ flush();
274
+ }
275
+ }
276
+ function updateComputed(c) {
277
+ c.depsTail = void 0;
278
+ c.flags = 1 | 4;
279
+ try {
280
+ const oldValue = c.value;
281
+ return oldValue !== (c.value = c.getter(oldValue));
282
+ } finally {
283
+ c.flags &= -5;
284
+ purgeDeps(c);
285
+ }
286
+ }
287
+ function updateSignal(s) {
288
+ s.flags = 1;
289
+ return s.currentValue !== (s.currentValue = s.pendingValue);
290
+ }
291
+ function run(e) {
292
+ const flags = e.flags;
293
+ if (flags & 16 || flags & 32 && checkDirty(e.deps, e)) {
294
+ e.depsTail = void 0;
295
+ e.flags = 2 | 4;
296
+ try {
297
+ ;
298
+ e.fn();
299
+ } finally {
300
+ e.flags &= -5;
301
+ purgeDeps(e);
302
+ }
303
+ } else {
304
+ e.flags = 2;
305
+ }
306
+ }
307
+ function flush() {
308
+ try {
309
+ while (notifyIndex < queuedLength) {
310
+ const effect2 = queued[notifyIndex];
311
+ queued[notifyIndex++] = void 0;
312
+ run(effect2);
313
+ }
314
+ } finally {
315
+ while (notifyIndex < queuedLength) {
316
+ const effect2 = queued[notifyIndex];
317
+ queued[notifyIndex++] = void 0;
318
+ effect2.flags |= 2 | 8;
319
+ }
320
+ notifyIndex = 0;
321
+ queuedLength = 0;
322
+ }
323
+ }
324
+ function effectScopeOper() {
325
+ this.depsTail = void 0;
326
+ this.flags = 0;
327
+ purgeDeps(this);
328
+ const sub = this.subs;
329
+ if (sub !== void 0) {
330
+ unlink(sub);
331
+ }
332
+ }
333
+ function purgeDeps(sub) {
334
+ const depsTail = sub.depsTail;
335
+ let dep = depsTail !== void 0 ? depsTail.nextDep : sub.deps;
336
+ while (dep !== void 0) {
337
+ dep = unlink(dep, sub);
338
+ }
339
+ }
340
+ exports.ReactiveFlags = ReactiveFlags;
341
+ exports.createReactiveSystem = createReactiveSystem;
342
+ exports.endBatch = endBatch;
343
+ exports.getBatchDepth = getBatchDepth;
344
+ exports.startBatch = startBatch;
345
+ //# sourceMappingURL=alien.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alien.cjs","sources":["../../src/alien.ts"],"sourcesContent":["/* eslint-disable */\n// Adapted from Alien Signals\n// https://github.com/stackblitz/alien-signals/\n\nexport interface ReactiveNode {\n deps?: Link\n depsTail?: Link\n subs?: Link\n subsTail?: Link\n flags: ReactiveFlags\n}\n\nexport interface Link {\n version: number\n dep: ReactiveNode\n sub: ReactiveNode\n prevSub: Link | undefined\n nextSub: Link | undefined\n prevDep: Link | undefined\n nextDep: Link | undefined\n}\n\ninterface Stack<T> {\n value: T\n prev: Stack<T> | undefined\n}\n\nexport const enum ReactiveFlags {\n None = 0,\n Mutable = 1,\n Watching = 2,\n RecursedCheck = 4,\n Recursed = 8,\n Dirty = 16,\n Pending = 32,\n}\n\nexport function createReactiveSystem({\n update,\n notify,\n unwatched,\n}: {\n update(sub: ReactiveNode): boolean\n notify(sub: ReactiveNode): void\n unwatched(sub: ReactiveNode): void\n}) {\n return {\n link,\n unlink,\n propagate,\n checkDirty,\n shallowPropagate,\n }\n\n function link(dep: ReactiveNode, sub: ReactiveNode, version: number): void {\n const prevDep = sub.depsTail\n if (prevDep !== undefined && prevDep.dep === dep) {\n return\n }\n const nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps\n if (nextDep !== undefined && nextDep.dep === dep) {\n nextDep.version = version\n sub.depsTail = nextDep\n return\n }\n const prevSub = dep.subsTail\n if (\n prevSub !== undefined &&\n prevSub.version === version &&\n prevSub.sub === sub\n ) {\n return\n }\n const newLink =\n (sub.depsTail =\n dep.subsTail =\n {\n version,\n dep,\n sub,\n prevDep,\n nextDep,\n prevSub,\n nextSub: undefined,\n })\n if (nextDep !== undefined) {\n nextDep.prevDep = newLink\n }\n if (prevDep !== undefined) {\n prevDep.nextDep = newLink\n } else {\n sub.deps = newLink\n }\n if (prevSub !== undefined) {\n prevSub.nextSub = newLink\n } else {\n dep.subs = newLink\n }\n }\n\n function unlink(link: Link, sub = link.sub): Link | undefined {\n const dep = link.dep\n const prevDep = link.prevDep\n const nextDep = link.nextDep\n const nextSub = link.nextSub\n const prevSub = link.prevSub\n if (nextDep !== undefined) {\n nextDep.prevDep = prevDep\n } else {\n sub.depsTail = prevDep\n }\n if (prevDep !== undefined) {\n prevDep.nextDep = nextDep\n } else {\n sub.deps = nextDep\n }\n if (nextSub !== undefined) {\n nextSub.prevSub = prevSub\n } else {\n dep.subsTail = prevSub\n }\n if (prevSub !== undefined) {\n prevSub.nextSub = nextSub\n } else if ((dep.subs = nextSub) === undefined) {\n unwatched(dep)\n }\n return nextDep\n }\n\n function propagate(link: Link): void {\n let next = link.nextSub\n let stack: Stack<Link | undefined> | undefined\n\n top: do {\n const sub = link.sub\n let flags = sub.flags\n\n if (\n !(\n flags &\n (ReactiveFlags.RecursedCheck |\n ReactiveFlags.Recursed |\n ReactiveFlags.Dirty |\n ReactiveFlags.Pending)\n )\n ) {\n sub.flags = flags | ReactiveFlags.Pending\n } else if (\n !(flags & (ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))\n ) {\n flags = ReactiveFlags.None\n } else if (!(flags & ReactiveFlags.RecursedCheck)) {\n sub.flags = (flags & ~ReactiveFlags.Recursed) | ReactiveFlags.Pending\n } else if (\n !(flags & (ReactiveFlags.Dirty | ReactiveFlags.Pending)) &&\n isValidLink(link, sub)\n ) {\n sub.flags = flags | (ReactiveFlags.Recursed | ReactiveFlags.Pending)\n flags &= ReactiveFlags.Mutable\n } else {\n flags = ReactiveFlags.None\n }\n\n if (flags & ReactiveFlags.Watching) {\n notify(sub)\n }\n\n if (flags & ReactiveFlags.Mutable) {\n const subSubs = sub.subs\n if (subSubs !== undefined) {\n const nextSub = (link = subSubs).nextSub\n if (nextSub !== undefined) {\n stack = { value: next, prev: stack }\n next = nextSub\n }\n continue\n }\n }\n\n if ((link = next!) !== undefined) {\n next = link.nextSub\n continue\n }\n\n while (stack !== undefined) {\n link = stack.value!\n stack = stack.prev\n if (link !== undefined) {\n next = link.nextSub\n continue top\n }\n }\n\n break\n } while (true)\n }\n\n function checkDirty(link: Link, sub: ReactiveNode): boolean {\n let stack: Stack<Link> | undefined\n let checkDepth = 0\n let dirty = false\n\n top: do {\n const dep = link.dep\n const flags = dep.flags\n\n if (sub.flags & ReactiveFlags.Dirty) {\n dirty = true\n } else if (\n (flags & (ReactiveFlags.Mutable | ReactiveFlags.Dirty)) ===\n (ReactiveFlags.Mutable | ReactiveFlags.Dirty)\n ) {\n if (update(dep)) {\n const subs = dep.subs!\n if (subs.nextSub !== undefined) {\n shallowPropagate(subs)\n }\n dirty = true\n }\n } else if (\n (flags & (ReactiveFlags.Mutable | ReactiveFlags.Pending)) ===\n (ReactiveFlags.Mutable | ReactiveFlags.Pending)\n ) {\n if (link.nextSub !== undefined || link.prevSub !== undefined) {\n stack = { value: link, prev: stack }\n }\n link = dep.deps!\n sub = dep\n ++checkDepth\n continue\n }\n\n if (!dirty) {\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue\n }\n }\n\n while (checkDepth--) {\n const firstSub = sub.subs!\n const hasMultipleSubs = firstSub.nextSub !== undefined\n if (hasMultipleSubs) {\n link = stack!.value\n stack = stack!.prev\n } else {\n link = firstSub\n }\n if (dirty) {\n if (update(sub)) {\n if (hasMultipleSubs) {\n shallowPropagate(firstSub)\n }\n sub = link.sub\n continue\n }\n dirty = false\n } else {\n sub.flags &= ~ReactiveFlags.Pending\n }\n sub = link.sub\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue top\n }\n }\n\n return dirty\n } while (true)\n }\n\n function shallowPropagate(link: Link): void {\n do {\n const sub = link.sub\n const flags = sub.flags\n if (\n (flags & (ReactiveFlags.Pending | ReactiveFlags.Dirty)) ===\n ReactiveFlags.Pending\n ) {\n sub.flags = flags | ReactiveFlags.Dirty\n if (\n (flags & (ReactiveFlags.Watching | ReactiveFlags.RecursedCheck)) ===\n ReactiveFlags.Watching\n ) {\n notify(sub)\n }\n }\n } while ((link = link.nextSub!) !== undefined)\n }\n\n function isValidLink(checkLink: Link, sub: ReactiveNode): boolean {\n let link = sub.depsTail\n while (link !== undefined) {\n if (link === checkLink) {\n return true\n }\n link = link.prevDep\n }\n return false\n }\n}\n\ninterface EffectNode extends ReactiveNode {\n fn(): void\n}\n\ninterface ComputedNode<T = any> extends ReactiveNode {\n value: T | undefined\n getter: (previousValue?: T) => T\n}\n\ninterface SignalNode<T = any> extends ReactiveNode {\n currentValue: T\n pendingValue: T\n}\n\nlet cycle = 0\nlet batchDepth = 0\nlet notifyIndex = 0\nlet queuedLength = 0\nlet activeSub: ReactiveNode | undefined\n\nconst queued: (EffectNode | undefined)[] = []\nconst { link, unlink, propagate, checkDirty, shallowPropagate } =\n createReactiveSystem({\n update(node: SignalNode | ComputedNode): boolean {\n if (node.depsTail !== undefined) {\n return updateComputed(node as ComputedNode)\n } else {\n return updateSignal(node as SignalNode)\n }\n },\n notify(effect: EffectNode) {\n let insertIndex = queuedLength\n let firstInsertedIndex = insertIndex\n\n do {\n queued[insertIndex++] = effect\n effect.flags &= ~ReactiveFlags.Watching\n effect = effect.subs?.sub as EffectNode\n if (effect === undefined || !(effect.flags & ReactiveFlags.Watching)) {\n break\n }\n } while (true)\n\n queuedLength = insertIndex\n\n while (firstInsertedIndex < --insertIndex) {\n const left = queued[firstInsertedIndex]\n queued[firstInsertedIndex++] = queued[insertIndex]\n queued[insertIndex] = left\n }\n },\n unwatched(node) {\n if (!(node.flags & ReactiveFlags.Mutable)) {\n effectScopeOper.call(node)\n } else if (node.depsTail !== undefined) {\n node.depsTail = undefined\n node.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n purgeDeps(node)\n }\n },\n })\n\nexport function getActiveSub(): ReactiveNode | undefined {\n return activeSub\n}\n\nexport function setActiveSub(sub?: ReactiveNode) {\n const prevSub = activeSub\n activeSub = sub\n return prevSub\n}\n\nexport function getBatchDepth(): number {\n return batchDepth\n}\n\nexport function startBatch() {\n ++batchDepth\n}\n\nexport function endBatch() {\n if (!--batchDepth) {\n flush()\n }\n}\n\nexport function isSignal(fn: () => void): boolean {\n return fn.name === 'bound ' + signalOper.name\n}\n\nexport function isComputed(fn: () => void): boolean {\n return fn.name === 'bound ' + computedOper.name\n}\n\nexport function isEffect(fn: () => void): boolean {\n return fn.name === 'bound ' + effectOper.name\n}\n\nexport function isEffectScope(fn: () => void): boolean {\n return fn.name === 'bound ' + effectScopeOper.name\n}\n\nexport function signal<T>(): {\n (): T | undefined\n (value: T | undefined): void\n}\nexport function signal<T>(initialValue: T): {\n (): T\n (value: T): void\n}\nexport function signal<T>(initialValue?: T): {\n (): T | undefined\n (value: T | undefined): void\n} {\n return signalOper.bind({\n currentValue: initialValue,\n pendingValue: initialValue,\n subs: undefined,\n subsTail: undefined,\n flags: ReactiveFlags.Mutable,\n }) as () => T | undefined\n}\n\nexport function computed<T>(getter: (previousValue?: T) => T): () => T {\n return computedOper.bind({\n value: undefined,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: ReactiveFlags.None,\n getter: getter as (previousValue?: unknown) => unknown,\n }) as () => T\n}\n\nexport function effect(fn: () => void): () => void {\n const e: EffectNode = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck,\n }\n const prevSub = setActiveSub(e)\n if (prevSub !== undefined) {\n link(e, prevSub, 0)\n }\n try {\n e.fn()\n } finally {\n activeSub = prevSub\n e.flags &= ~ReactiveFlags.RecursedCheck\n }\n return effectOper.bind(e)\n}\n\nexport function effectScope(fn: () => void): () => void {\n const e: ReactiveNode = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: ReactiveFlags.None,\n }\n const prevSub = setActiveSub(e)\n if (prevSub !== undefined) {\n link(e, prevSub, 0)\n }\n try {\n fn()\n } finally {\n activeSub = prevSub\n }\n return effectScopeOper.bind(e)\n}\n\nexport function trigger(fn: () => void) {\n const sub: ReactiveNode = {\n deps: undefined,\n depsTail: undefined,\n flags: ReactiveFlags.Watching,\n }\n const prevSub = setActiveSub(sub)\n try {\n fn()\n } finally {\n activeSub = prevSub\n let link = sub.deps\n while (link !== undefined) {\n const dep = link.dep\n link = unlink(link, sub)\n const subs = dep.subs\n if (subs !== undefined) {\n sub.flags = ReactiveFlags.None\n propagate(subs)\n shallowPropagate(subs)\n }\n }\n if (!batchDepth) {\n flush()\n }\n }\n}\n\nfunction updateComputed(c: ComputedNode): boolean {\n ++cycle\n c.depsTail = undefined\n c.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck\n const prevSub = setActiveSub(c)\n try {\n const oldValue = c.value\n return oldValue !== (c.value = c.getter(oldValue))\n } finally {\n activeSub = prevSub\n c.flags &= ~ReactiveFlags.RecursedCheck\n purgeDeps(c)\n }\n}\n\nfunction updateSignal(s: SignalNode): boolean {\n s.flags = ReactiveFlags.Mutable\n return s.currentValue !== (s.currentValue = s.pendingValue)\n}\n\nfunction run(e: EffectNode): void {\n const flags = e.flags\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending && checkDirty(e.deps!, e))\n ) {\n ++cycle\n e.depsTail = undefined\n e.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck\n const prevSub = setActiveSub(e)\n try {\n ;(e as EffectNode).fn()\n } finally {\n activeSub = prevSub\n e.flags &= ~ReactiveFlags.RecursedCheck\n purgeDeps(e)\n }\n } else {\n e.flags = ReactiveFlags.Watching\n }\n}\n\nfunction flush(): void {\n try {\n while (notifyIndex < queuedLength) {\n const effect = queued[notifyIndex]!\n queued[notifyIndex++] = undefined\n run(effect)\n }\n } finally {\n while (notifyIndex < queuedLength) {\n const effect = queued[notifyIndex]!\n queued[notifyIndex++] = undefined\n effect.flags |= ReactiveFlags.Watching | ReactiveFlags.Recursed\n }\n notifyIndex = 0\n queuedLength = 0\n }\n}\n\nfunction computedOper<T>(this: ComputedNode<T>): T {\n const flags = this.flags\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending &&\n (checkDirty(this.deps!, this) ||\n ((this.flags = flags & ~ReactiveFlags.Pending), false)))\n ) {\n if (updateComputed(this)) {\n const subs = this.subs\n if (subs !== undefined) {\n shallowPropagate(subs)\n }\n }\n } else if (!flags) {\n this.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck\n const prevSub = setActiveSub(this)\n try {\n this.value = this.getter()\n } finally {\n activeSub = prevSub\n this.flags &= ~ReactiveFlags.RecursedCheck\n }\n }\n const sub = activeSub\n if (sub !== undefined) {\n link(this, sub, cycle)\n }\n return this.value!\n}\n\nfunction signalOper<T>(this: SignalNode<T>, ...value: [T]): T | void {\n if (value.length) {\n if (this.pendingValue !== (this.pendingValue = value[0])) {\n this.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n const subs = this.subs\n if (subs !== undefined) {\n propagate(subs)\n if (!batchDepth) {\n flush()\n }\n }\n }\n } else {\n if (this.flags & ReactiveFlags.Dirty) {\n if (updateSignal(this)) {\n const subs = this.subs\n if (subs !== undefined) {\n shallowPropagate(subs)\n }\n }\n }\n let sub = activeSub\n while (sub !== undefined) {\n if (sub.flags & (ReactiveFlags.Mutable | ReactiveFlags.Watching)) {\n link(this, sub, cycle)\n break\n }\n sub = sub.subs?.sub\n }\n return this.currentValue\n }\n}\n\nfunction effectOper(this: EffectNode): void {\n effectScopeOper.call(this)\n}\n\nfunction effectScopeOper(this: ReactiveNode): void {\n this.depsTail = undefined\n this.flags = ReactiveFlags.None\n purgeDeps(this)\n const sub = this.subs\n if (sub !== undefined) {\n unlink(sub)\n }\n}\n\nfunction purgeDeps(sub: ReactiveNode) {\n const depsTail = sub.depsTail\n let dep = depsTail !== undefined ? depsTail.nextDep : sub.deps\n while (dep !== undefined) {\n dep = unlink(dep, sub)\n }\n}\n"],"names":["ReactiveFlags","link","unlink","propagate","checkDirty","shallowPropagate","effect"],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export interface ReactiveNode {
2
+ deps?: Link;
3
+ depsTail?: Link;
4
+ subs?: Link;
5
+ subsTail?: Link;
6
+ flags: ReactiveFlags;
7
+ }
8
+ export interface Link {
9
+ version: number;
10
+ dep: ReactiveNode;
11
+ sub: ReactiveNode;
12
+ prevSub: Link | undefined;
13
+ nextSub: Link | undefined;
14
+ prevDep: Link | undefined;
15
+ nextDep: Link | undefined;
16
+ }
17
+ export declare const enum ReactiveFlags {
18
+ None = 0,
19
+ Mutable = 1,
20
+ Watching = 2,
21
+ RecursedCheck = 4,
22
+ Recursed = 8,
23
+ Dirty = 16,
24
+ Pending = 32
25
+ }
26
+ export declare function createReactiveSystem({ update, notify, unwatched, }: {
27
+ update(sub: ReactiveNode): boolean;
28
+ notify(sub: ReactiveNode): void;
29
+ unwatched(sub: ReactiveNode): void;
30
+ }): {
31
+ link: (dep: ReactiveNode, sub: ReactiveNode, version: number) => void;
32
+ unlink: (link: Link, sub?: ReactiveNode) => Link | undefined;
33
+ propagate: (link: Link) => void;
34
+ checkDirty: (link: Link, sub: ReactiveNode) => boolean;
35
+ shallowPropagate: (link: Link) => void;
36
+ };
37
+ export declare function getActiveSub(): ReactiveNode | undefined;
38
+ export declare function setActiveSub(sub?: ReactiveNode): ReactiveNode | undefined;
39
+ export declare function getBatchDepth(): number;
40
+ export declare function startBatch(): void;
41
+ export declare function endBatch(): void;
42
+ export declare function isSignal(fn: () => void): boolean;
43
+ export declare function isComputed(fn: () => void): boolean;
44
+ export declare function isEffect(fn: () => void): boolean;
45
+ export declare function isEffectScope(fn: () => void): boolean;
46
+ export declare function signal<T>(): {
47
+ (): T | undefined;
48
+ (value: T | undefined): void;
49
+ };
50
+ export declare function signal<T>(initialValue: T): {
51
+ (): T;
52
+ (value: T): void;
53
+ };
54
+ export declare function computed<T>(getter: (previousValue?: T) => T): () => T;
55
+ export declare function effect(fn: () => void): () => void;
56
+ export declare function effectScope(fn: () => void): () => void;
57
+ export declare function trigger(fn: () => void): void;
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const alien = require("./alien.cjs");
4
+ function toObserver(nextHandler, errorHandler, completionHandler) {
5
+ const isObserver = typeof nextHandler === "object";
6
+ const self = isObserver ? nextHandler : void 0;
7
+ return {
8
+ next: (isObserver ? nextHandler.next : nextHandler)?.bind(self),
9
+ error: (isObserver ? nextHandler.error : errorHandler)?.bind(self),
10
+ complete: (isObserver ? nextHandler.complete : completionHandler)?.bind(
11
+ self
12
+ )
13
+ };
14
+ }
15
+ const queuedEffects = [];
16
+ let cycle = 0;
17
+ const { link, unlink, propagate, checkDirty, shallowPropagate } = alien.createReactiveSystem({
18
+ update(atom) {
19
+ return atom._update();
20
+ },
21
+ // eslint-disable-next-line no-shadow
22
+ notify(effect2) {
23
+ queuedEffects[queuedEffectsLength++] = effect2;
24
+ effect2.flags &= ~alien.ReactiveFlags.Watching;
25
+ },
26
+ unwatched(atom) {
27
+ if (atom.depsTail !== void 0) {
28
+ atom.depsTail = void 0;
29
+ atom.flags = alien.ReactiveFlags.Mutable | alien.ReactiveFlags.Dirty;
30
+ purgeDeps(atom);
31
+ }
32
+ }
33
+ });
34
+ let notifyIndex = 0;
35
+ let queuedEffectsLength = 0;
36
+ let activeSub;
37
+ function purgeDeps(sub) {
38
+ const depsTail = sub.depsTail;
39
+ let dep = depsTail !== void 0 ? depsTail.nextDep : sub.deps;
40
+ while (dep !== void 0) {
41
+ dep = unlink(dep, sub);
42
+ }
43
+ }
44
+ function flush() {
45
+ if (alien.getBatchDepth() > 0) {
46
+ return;
47
+ }
48
+ while (notifyIndex < queuedEffectsLength) {
49
+ const effect2 = queuedEffects[notifyIndex];
50
+ queuedEffects[notifyIndex++] = void 0;
51
+ effect2.notify();
52
+ }
53
+ notifyIndex = 0;
54
+ queuedEffectsLength = 0;
55
+ }
56
+ function createAsyncAtom(getValue, options) {
57
+ const ref = {};
58
+ const atom = createAtom(() => {
59
+ getValue().then(
60
+ (data) => {
61
+ const internalAtom = ref.current;
62
+ if (internalAtom._update({ status: "done", data })) {
63
+ const subs = internalAtom.subs;
64
+ if (subs !== void 0) {
65
+ propagate(subs);
66
+ shallowPropagate(subs);
67
+ flush();
68
+ }
69
+ }
70
+ },
71
+ (error) => {
72
+ const internalAtom = ref.current;
73
+ if (internalAtom._update({ status: "error", error })) {
74
+ const subs = internalAtom.subs;
75
+ if (subs !== void 0) {
76
+ propagate(subs);
77
+ shallowPropagate(subs);
78
+ flush();
79
+ }
80
+ }
81
+ }
82
+ );
83
+ return { status: "pending" };
84
+ }, options);
85
+ ref.current = atom;
86
+ return atom;
87
+ }
88
+ function createAtom(valueOrFn, options) {
89
+ const isComputed = typeof valueOrFn === "function";
90
+ const getter = valueOrFn;
91
+ const atom = {
92
+ _snapshot: isComputed ? void 0 : valueOrFn,
93
+ subs: void 0,
94
+ subsTail: void 0,
95
+ deps: void 0,
96
+ depsTail: void 0,
97
+ flags: isComputed ? alien.ReactiveFlags.None : alien.ReactiveFlags.Mutable,
98
+ get() {
99
+ if (activeSub !== void 0) {
100
+ link(atom, activeSub, cycle);
101
+ }
102
+ return atom._snapshot;
103
+ },
104
+ subscribe(observerOrFn) {
105
+ const obs = toObserver(observerOrFn);
106
+ const observed = { current: false };
107
+ const e = effect(() => {
108
+ atom.get();
109
+ if (!observed.current) {
110
+ observed.current = true;
111
+ } else {
112
+ obs.next?.(atom._snapshot);
113
+ }
114
+ });
115
+ return {
116
+ unsubscribe: () => {
117
+ e.stop();
118
+ }
119
+ };
120
+ },
121
+ _update(getValue) {
122
+ const prevSub = activeSub;
123
+ const compare = options?.compare ?? Object.is;
124
+ activeSub = atom;
125
+ ++cycle;
126
+ atom.depsTail = void 0;
127
+ if (isComputed) {
128
+ atom.flags = alien.ReactiveFlags.Mutable | alien.ReactiveFlags.RecursedCheck;
129
+ }
130
+ try {
131
+ const oldValue = atom._snapshot;
132
+ const newValue = typeof getValue === "function" ? getValue(oldValue) : getValue === void 0 && isComputed ? getter(oldValue) : getValue;
133
+ if (oldValue === void 0 || !compare(oldValue, newValue)) {
134
+ atom._snapshot = newValue;
135
+ return true;
136
+ }
137
+ return false;
138
+ } finally {
139
+ activeSub = prevSub;
140
+ if (isComputed) {
141
+ atom.flags &= ~alien.ReactiveFlags.RecursedCheck;
142
+ }
143
+ purgeDeps(atom);
144
+ }
145
+ }
146
+ };
147
+ if (isComputed) {
148
+ atom.flags = alien.ReactiveFlags.Mutable | alien.ReactiveFlags.Dirty;
149
+ atom.get = function() {
150
+ const flags = atom.flags;
151
+ if (flags & alien.ReactiveFlags.Dirty || flags & alien.ReactiveFlags.Pending && checkDirty(atom.deps, atom)) {
152
+ if (atom._update()) {
153
+ const subs = atom.subs;
154
+ if (subs !== void 0) {
155
+ shallowPropagate(subs);
156
+ }
157
+ }
158
+ } else if (flags & alien.ReactiveFlags.Pending) {
159
+ atom.flags = flags & ~alien.ReactiveFlags.Pending;
160
+ }
161
+ if (activeSub !== void 0) {
162
+ link(atom, activeSub, cycle);
163
+ }
164
+ return atom._snapshot;
165
+ };
166
+ } else {
167
+ atom.set = function(valueOrFn2) {
168
+ if (atom._update(valueOrFn2)) {
169
+ const subs = atom.subs;
170
+ if (subs !== void 0) {
171
+ propagate(subs);
172
+ shallowPropagate(subs);
173
+ flush();
174
+ }
175
+ }
176
+ };
177
+ }
178
+ return atom;
179
+ }
180
+ function effect(fn) {
181
+ const run = () => {
182
+ const prevSub = activeSub;
183
+ activeSub = effectObj;
184
+ ++cycle;
185
+ effectObj.depsTail = void 0;
186
+ effectObj.flags = alien.ReactiveFlags.Watching | alien.ReactiveFlags.RecursedCheck;
187
+ try {
188
+ return fn();
189
+ } finally {
190
+ activeSub = prevSub;
191
+ effectObj.flags &= ~alien.ReactiveFlags.RecursedCheck;
192
+ purgeDeps(effectObj);
193
+ }
194
+ };
195
+ const effectObj = {
196
+ deps: void 0,
197
+ depsTail: void 0,
198
+ subs: void 0,
199
+ subsTail: void 0,
200
+ flags: alien.ReactiveFlags.Watching | alien.ReactiveFlags.RecursedCheck,
201
+ notify() {
202
+ const flags = this.flags;
203
+ if (flags & alien.ReactiveFlags.Dirty || flags & alien.ReactiveFlags.Pending && checkDirty(this.deps, this)) {
204
+ run();
205
+ } else {
206
+ this.flags = alien.ReactiveFlags.Watching;
207
+ }
208
+ },
209
+ stop() {
210
+ this.flags = alien.ReactiveFlags.None;
211
+ this.depsTail = void 0;
212
+ purgeDeps(this);
213
+ }
214
+ };
215
+ run();
216
+ return effectObj;
217
+ }
218
+ exports.createAsyncAtom = createAsyncAtom;
219
+ exports.createAtom = createAtom;
220
+ exports.flush = flush;
221
+ exports.toObserver = toObserver;
222
+ //# sourceMappingURL=atom.cjs.map