@tanstack/store
Advanced tools
+23
-27
| //#region src/alien.ts | ||
| let ReactiveFlags = /* @__PURE__ */ function(ReactiveFlags) { | ||
| ReactiveFlags[ReactiveFlags["None"] = 0] = "None"; | ||
| ReactiveFlags[ReactiveFlags["Mutable"] = 1] = "Mutable"; | ||
| ReactiveFlags[ReactiveFlags["Watching"] = 2] = "Watching"; | ||
| ReactiveFlags[ReactiveFlags["RecursedCheck"] = 4] = "RecursedCheck"; | ||
| ReactiveFlags[ReactiveFlags["Recursed"] = 8] = "Recursed"; | ||
| ReactiveFlags[ReactiveFlags["Dirty"] = 16] = "Dirty"; | ||
| ReactiveFlags[ReactiveFlags["Pending"] = 32] = "Pending"; | ||
| return ReactiveFlags; | ||
| }({}); | ||
| const NONE = 0; | ||
| const MUTABLE = 1; | ||
| const WATCHING = 2; | ||
| const RECURSED_CHECK = 4; | ||
| const RECURSED = 8; | ||
| const DIRTY = 16; | ||
| const PENDING = 32; | ||
| /* @__NO_SIDE_EFFECTS__ */ | ||
@@ -70,11 +67,11 @@ function createReactiveSystem({ update, notify, unwatched }) { | ||
| let flags = sub.flags; | ||
| if (!(flags & (ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed | ReactiveFlags.Dirty | ReactiveFlags.Pending))) sub.flags = flags | ReactiveFlags.Pending; | ||
| else if (!(flags & (ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))) flags = ReactiveFlags.None; | ||
| else if (!(flags & ReactiveFlags.RecursedCheck)) sub.flags = flags & ~ReactiveFlags.Recursed | ReactiveFlags.Pending; | ||
| else if (!(flags & (ReactiveFlags.Dirty | ReactiveFlags.Pending)) && isValidLink(link, sub)) { | ||
| sub.flags = flags | (ReactiveFlags.Recursed | ReactiveFlags.Pending); | ||
| flags &= ReactiveFlags.Mutable; | ||
| } else flags = ReactiveFlags.None; | ||
| if (flags & ReactiveFlags.Watching) notify(sub); | ||
| if (flags & ReactiveFlags.Mutable) { | ||
| if (!(flags & 60)) sub.flags = flags | 32; | ||
| else if (!(flags & (4 | 8))) flags = 0; | ||
| else if (!(flags & 4)) sub.flags = flags & ~8 | 32; | ||
| else if (!(flags & (16 | 32)) && isValidLink(link, sub)) { | ||
| sub.flags = flags | (8 | 32); | ||
| flags &= 1; | ||
| } else flags = 0; | ||
| if (flags & 2) notify(sub); | ||
| if (flags & 1) { | ||
| const subSubs = sub.subs; | ||
@@ -115,4 +112,4 @@ if (subSubs !== void 0) { | ||
| const flags = dep.flags; | ||
| if (sub.flags & ReactiveFlags.Dirty) dirty = true; | ||
| else if ((flags & (ReactiveFlags.Mutable | ReactiveFlags.Dirty)) === (ReactiveFlags.Mutable | ReactiveFlags.Dirty)) { | ||
| if (sub.flags & 16) dirty = true; | ||
| else if ((flags & (1 | 16)) === (1 | 16)) { | ||
| if (update(dep)) { | ||
@@ -123,3 +120,3 @@ const subs = dep.subs; | ||
| } | ||
| } else if ((flags & (ReactiveFlags.Mutable | ReactiveFlags.Pending)) === (ReactiveFlags.Mutable | ReactiveFlags.Pending)) { | ||
| } else if ((flags & (1 | 32)) === (1 | 32)) { | ||
| if (link.nextSub !== void 0 || link.prevSub !== void 0) stack = { | ||
@@ -155,3 +152,3 @@ value: link, | ||
| dirty = false; | ||
| } else sub.flags &= ~ReactiveFlags.Pending; | ||
| } else sub.flags &= ~32; | ||
| sub = link.sub; | ||
@@ -171,5 +168,5 @@ const nextDep = link.nextDep; | ||
| const flags = sub.flags; | ||
| if ((flags & (ReactiveFlags.Pending | ReactiveFlags.Dirty)) === ReactiveFlags.Pending) { | ||
| sub.flags = flags | ReactiveFlags.Dirty; | ||
| if ((flags & (ReactiveFlags.Watching | ReactiveFlags.RecursedCheck)) === ReactiveFlags.Watching) notify(sub); | ||
| if ((flags & (32 | 16)) === 32) { | ||
| sub.flags = flags | 16; | ||
| if ((flags & (2 | 4)) === 2) notify(sub); | ||
| } | ||
@@ -189,4 +186,3 @@ } while ((link = link.nextSub) !== void 0); | ||
| //#endregion | ||
| exports.ReactiveFlags = ReactiveFlags; | ||
| exports.createReactiveSystem = createReactiveSystem; | ||
| //# sourceMappingURL=alien.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"alien.cjs","names":[],"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/*@__NO_SIDE_EFFECTS__*/\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"],"mappings":"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"} | ||
| {"version":3,"file":"alien.cjs","names":[],"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 type ReactiveFlags = number\n\nexport const NONE = 0\nexport const MUTABLE = 1\nexport const WATCHING = 2\nexport const RECURSED_CHECK = 4\nexport const RECURSED = 8\nexport const DIRTY = 16\nexport const PENDING = 32\n/*@__NO_SIDE_EFFECTS__*/\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 (!(flags & (RECURSED_CHECK | RECURSED | DIRTY | PENDING))) {\n sub.flags = flags | PENDING\n } else if (!(flags & (RECURSED_CHECK | RECURSED))) {\n flags = NONE\n } else if (!(flags & RECURSED_CHECK)) {\n sub.flags = (flags & ~RECURSED) | PENDING\n } else if (!(flags & (DIRTY | PENDING)) && isValidLink(link, sub)) {\n sub.flags = flags | (RECURSED | PENDING)\n flags &= MUTABLE\n } else {\n flags = NONE\n }\n\n if (flags & WATCHING) {\n notify(sub)\n }\n\n if (flags & 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 & DIRTY) {\n dirty = true\n } else if ((flags & (MUTABLE | DIRTY)) === (MUTABLE | DIRTY)) {\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 ((flags & (MUTABLE | PENDING)) === (MUTABLE | PENDING)) {\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 &= ~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 ((flags & (PENDING | DIRTY)) === PENDING) {\n sub.flags = flags | DIRTY\n if ((flags & (WATCHING | RECURSED_CHECK)) === WATCHING) {\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"],"mappings":"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"} |
+1
-9
@@ -18,13 +18,5 @@ //#region src/alien.d.ts | ||
| } | ||
| declare const enum ReactiveFlags { | ||
| None = 0, | ||
| Mutable = 1, | ||
| Watching = 2, | ||
| RecursedCheck = 4, | ||
| Recursed = 8, | ||
| Dirty = 16, | ||
| Pending = 32 | ||
| } | ||
| type ReactiveFlags = number; | ||
| //#endregion | ||
| export { ReactiveNode }; | ||
| //# sourceMappingURL=alien.d.cts.map |
+1
-9
@@ -18,13 +18,5 @@ //#region src/alien.d.ts | ||
| } | ||
| declare const enum ReactiveFlags { | ||
| None = 0, | ||
| Mutable = 1, | ||
| Watching = 2, | ||
| RecursedCheck = 4, | ||
| Recursed = 8, | ||
| Dirty = 16, | ||
| Pending = 32 | ||
| } | ||
| type ReactiveFlags = number; | ||
| //#endregion | ||
| export { ReactiveNode }; | ||
| //# sourceMappingURL=alien.d.ts.map |
+24
-27
| //#region src/alien.ts | ||
| let ReactiveFlags = /* @__PURE__ */ function(ReactiveFlags) { | ||
| ReactiveFlags[ReactiveFlags["None"] = 0] = "None"; | ||
| ReactiveFlags[ReactiveFlags["Mutable"] = 1] = "Mutable"; | ||
| ReactiveFlags[ReactiveFlags["Watching"] = 2] = "Watching"; | ||
| ReactiveFlags[ReactiveFlags["RecursedCheck"] = 4] = "RecursedCheck"; | ||
| ReactiveFlags[ReactiveFlags["Recursed"] = 8] = "Recursed"; | ||
| ReactiveFlags[ReactiveFlags["Dirty"] = 16] = "Dirty"; | ||
| ReactiveFlags[ReactiveFlags["Pending"] = 32] = "Pending"; | ||
| return ReactiveFlags; | ||
| }({}); | ||
| const NONE = 0; | ||
| const MUTABLE = 1; | ||
| const WATCHING = 2; | ||
| const RECURSED_CHECK = 4; | ||
| const RECURSED = 8; | ||
| const DIRTY = 16; | ||
| const PENDING = 32; | ||
| /* @__NO_SIDE_EFFECTS__ */ | ||
@@ -69,11 +66,11 @@ function createReactiveSystem({ update, notify, unwatched }) { | ||
| let flags = sub.flags; | ||
| if (!(flags & (ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed | ReactiveFlags.Dirty | ReactiveFlags.Pending))) sub.flags = flags | ReactiveFlags.Pending; | ||
| else if (!(flags & (ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))) flags = ReactiveFlags.None; | ||
| else if (!(flags & ReactiveFlags.RecursedCheck)) sub.flags = flags & ~ReactiveFlags.Recursed | ReactiveFlags.Pending; | ||
| else if (!(flags & (ReactiveFlags.Dirty | ReactiveFlags.Pending)) && isValidLink(link, sub)) { | ||
| sub.flags = flags | (ReactiveFlags.Recursed | ReactiveFlags.Pending); | ||
| flags &= ReactiveFlags.Mutable; | ||
| } else flags = ReactiveFlags.None; | ||
| if (flags & ReactiveFlags.Watching) notify(sub); | ||
| if (flags & ReactiveFlags.Mutable) { | ||
| if (!(flags & 60)) sub.flags = flags | 32; | ||
| else if (!(flags & (4 | 8))) flags = 0; | ||
| else if (!(flags & 4)) sub.flags = flags & ~8 | 32; | ||
| else if (!(flags & (16 | 32)) && isValidLink(link, sub)) { | ||
| sub.flags = flags | (8 | 32); | ||
| flags &= 1; | ||
| } else flags = 0; | ||
| if (flags & 2) notify(sub); | ||
| if (flags & 1) { | ||
| const subSubs = sub.subs; | ||
@@ -114,4 +111,4 @@ if (subSubs !== void 0) { | ||
| const flags = dep.flags; | ||
| if (sub.flags & ReactiveFlags.Dirty) dirty = true; | ||
| else if ((flags & (ReactiveFlags.Mutable | ReactiveFlags.Dirty)) === (ReactiveFlags.Mutable | ReactiveFlags.Dirty)) { | ||
| if (sub.flags & 16) dirty = true; | ||
| else if ((flags & (1 | 16)) === (1 | 16)) { | ||
| if (update(dep)) { | ||
@@ -122,3 +119,3 @@ const subs = dep.subs; | ||
| } | ||
| } else if ((flags & (ReactiveFlags.Mutable | ReactiveFlags.Pending)) === (ReactiveFlags.Mutable | ReactiveFlags.Pending)) { | ||
| } else if ((flags & (1 | 32)) === (1 | 32)) { | ||
| if (link.nextSub !== void 0 || link.prevSub !== void 0) stack = { | ||
@@ -154,3 +151,3 @@ value: link, | ||
| dirty = false; | ||
| } else sub.flags &= ~ReactiveFlags.Pending; | ||
| } else sub.flags &= ~32; | ||
| sub = link.sub; | ||
@@ -170,5 +167,5 @@ const nextDep = link.nextDep; | ||
| const flags = sub.flags; | ||
| if ((flags & (ReactiveFlags.Pending | ReactiveFlags.Dirty)) === ReactiveFlags.Pending) { | ||
| sub.flags = flags | ReactiveFlags.Dirty; | ||
| if ((flags & (ReactiveFlags.Watching | ReactiveFlags.RecursedCheck)) === ReactiveFlags.Watching) notify(sub); | ||
| if ((flags & (32 | 16)) === 32) { | ||
| sub.flags = flags | 16; | ||
| if ((flags & (2 | 4)) === 2) notify(sub); | ||
| } | ||
@@ -188,3 +185,3 @@ } while ((link = link.nextSub) !== void 0); | ||
| //#endregion | ||
| export { ReactiveFlags, createReactiveSystem }; | ||
| export { createReactiveSystem }; | ||
| //# sourceMappingURL=alien.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"alien.js","names":[],"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/*@__NO_SIDE_EFFECTS__*/\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"],"mappings":"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"} | ||
| {"version":3,"file":"alien.js","names":[],"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 type ReactiveFlags = number\n\nexport const NONE = 0\nexport const MUTABLE = 1\nexport const WATCHING = 2\nexport const RECURSED_CHECK = 4\nexport const RECURSED = 8\nexport const DIRTY = 16\nexport const PENDING = 32\n/*@__NO_SIDE_EFFECTS__*/\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 (!(flags & (RECURSED_CHECK | RECURSED | DIRTY | PENDING))) {\n sub.flags = flags | PENDING\n } else if (!(flags & (RECURSED_CHECK | RECURSED))) {\n flags = NONE\n } else if (!(flags & RECURSED_CHECK)) {\n sub.flags = (flags & ~RECURSED) | PENDING\n } else if (!(flags & (DIRTY | PENDING)) && isValidLink(link, sub)) {\n sub.flags = flags | (RECURSED | PENDING)\n flags &= MUTABLE\n } else {\n flags = NONE\n }\n\n if (flags & WATCHING) {\n notify(sub)\n }\n\n if (flags & 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 & DIRTY) {\n dirty = true\n } else if ((flags & (MUTABLE | DIRTY)) === (MUTABLE | DIRTY)) {\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 ((flags & (MUTABLE | PENDING)) === (MUTABLE | PENDING)) {\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 &= ~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 ((flags & (PENDING | DIRTY)) === PENDING) {\n sub.flags = flags | DIRTY\n if ((flags & (WATCHING | RECURSED_CHECK)) === WATCHING) {\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"],"mappings":"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"} |
+14
-14
@@ -21,3 +21,3 @@ const require_alien = require('./alien.cjs'); | ||
| queuedEffects[queuedEffectsLength++] = effect; | ||
| effect.flags &= ~require_alien.ReactiveFlags.Watching; | ||
| effect.flags &= ~2; | ||
| }, | ||
@@ -27,3 +27,3 @@ unwatched(atom) { | ||
| atom.depsTail = void 0; | ||
| atom.flags = require_alien.ReactiveFlags.Mutable | require_alien.ReactiveFlags.Dirty; | ||
| atom.flags = 1 | 16; | ||
| purgeDeps(atom); | ||
@@ -104,3 +104,3 @@ } | ||
| depsTail: void 0, | ||
| flags: isComputed ? require_alien.ReactiveFlags.None : require_alien.ReactiveFlags.Mutable, | ||
| flags: isComputed ? 0 : 1, | ||
| get() { | ||
@@ -130,3 +130,3 @@ if (activeSub !== void 0) link(atom, activeSub, cycle); | ||
| } else if (getValue === void 0) return false; | ||
| if (isComputed) atom.flags = require_alien.ReactiveFlags.Mutable | require_alien.ReactiveFlags.RecursedCheck; | ||
| if (isComputed) atom.flags = 1 | 4; | ||
| try { | ||
@@ -142,3 +142,3 @@ const oldValue = atom._snapshot; | ||
| activeSub = prevSub; | ||
| if (isComputed) atom.flags &= ~require_alien.ReactiveFlags.RecursedCheck; | ||
| if (isComputed) atom.flags &= ~4; | ||
| purgeDeps(atom); | ||
@@ -149,6 +149,6 @@ } | ||
| if (isComputed) { | ||
| atom.flags = require_alien.ReactiveFlags.Mutable | require_alien.ReactiveFlags.Dirty; | ||
| atom.flags = 1 | 16; | ||
| atom.get = function() { | ||
| const flags = atom.flags; | ||
| if (flags & require_alien.ReactiveFlags.Dirty || flags & require_alien.ReactiveFlags.Pending && checkDirty(atom.deps, atom)) { | ||
| if (flags & 16 || flags & 32 && checkDirty(atom.deps, atom)) { | ||
| if (atom._update()) { | ||
@@ -158,3 +158,3 @@ const subs = atom.subs; | ||
| } | ||
| } else if (flags & require_alien.ReactiveFlags.Pending) atom.flags = flags & ~require_alien.ReactiveFlags.Pending; | ||
| } else if (flags & 32) atom.flags = flags & ~32; | ||
| if (activeSub !== void 0) link(atom, activeSub, cycle); | ||
@@ -181,3 +181,3 @@ return atom._snapshot; | ||
| effectObj.depsTail = void 0; | ||
| effectObj.flags = require_alien.ReactiveFlags.Watching | require_alien.ReactiveFlags.RecursedCheck; | ||
| effectObj.flags = 2 | 4; | ||
| try { | ||
@@ -187,3 +187,3 @@ return fn(); | ||
| activeSub = prevSub; | ||
| effectObj.flags &= ~require_alien.ReactiveFlags.RecursedCheck; | ||
| effectObj.flags &= ~4; | ||
| purgeDeps(effectObj); | ||
@@ -197,10 +197,10 @@ } | ||
| subsTail: void 0, | ||
| flags: require_alien.ReactiveFlags.Watching | require_alien.ReactiveFlags.RecursedCheck, | ||
| flags: 2 | 4, | ||
| notify() { | ||
| const flags = this.flags; | ||
| if (flags & require_alien.ReactiveFlags.Dirty || flags & require_alien.ReactiveFlags.Pending && checkDirty(this.deps, this)) run(); | ||
| else this.flags = require_alien.ReactiveFlags.Watching; | ||
| if (flags & 16 || flags & 32 && checkDirty(this.deps, this)) run(); | ||
| else this.flags = 2; | ||
| }, | ||
| stop() { | ||
| this.flags = require_alien.ReactiveFlags.None; | ||
| this.flags = 0; | ||
| this.depsTail = void 0; | ||
@@ -207,0 +207,0 @@ purgeDeps(this); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"atom.cjs","names":["ReactiveFlags"],"sources":["../src/atom.ts"],"sourcesContent":["import { ReactiveFlags, createReactiveSystem } from './alien'\n\nimport type { ReactiveNode } from './alien'\nimport type {\n Atom,\n AtomOptions,\n Observer,\n ReadonlyAtom,\n Subscription,\n} from './types'\n\nexport function toObserver<T>(\n nextHandler?: Observer<T> | ((value: T) => void),\n errorHandler?: (error: any) => void,\n completionHandler?: () => void,\n): Observer<T> {\n const isObserver = typeof nextHandler === 'object'\n const self = isObserver ? nextHandler : undefined\n\n return {\n next: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n error: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n complete: (isObserver ? nextHandler.complete : completionHandler)?.bind(\n self,\n ),\n }\n}\n\ninterface InternalAtom<T> extends ReactiveNode {\n _snapshot: T\n _update: (getValue?: T | ((snapshot: T) => T)) => boolean\n get: () => T\n subscribe: (observerOrFn: Observer<T> | ((value: T) => void)) => Subscription\n}\n\nconst queuedEffects: Array<Effect | undefined> = []\nlet cycle = 0\nconst { link, unlink, propagate, checkDirty, shallowPropagate } =\n createReactiveSystem({\n update(atom: InternalAtom<any>): boolean {\n return atom._update()\n },\n // eslint-disable-next-line no-shadow\n notify(effect: Effect): void {\n queuedEffects[queuedEffectsLength++] = effect\n effect.flags &= ~ReactiveFlags.Watching\n },\n unwatched(atom: InternalAtom<any>): void {\n if (atom.depsTail !== undefined) {\n atom.depsTail = undefined\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n purgeDeps(atom)\n }\n },\n })\n\nlet notifyIndex = 0\nlet queuedEffectsLength = 0\nlet activeSub: ReactiveNode | undefined\nlet batchDepth = 0\n\nexport function batch(fn: () => void) {\n try {\n ++batchDepth\n fn()\n } finally {\n if (!--batchDepth) {\n flush()\n }\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\nexport function flush(): void {\n if (batchDepth > 0) {\n return\n }\n while (notifyIndex < queuedEffectsLength) {\n // eslint-disable-next-line no-shadow\n const effect = queuedEffects[notifyIndex]!\n queuedEffects[notifyIndex++] = undefined\n effect.notify()\n }\n notifyIndex = 0\n queuedEffectsLength = 0\n}\n\ntype AsyncAtomState<TData, TError = unknown> =\n | { status: 'pending' }\n | { status: 'done'; data: TData }\n | { status: 'error'; error: TError }\n\nexport function createAsyncAtom<T>(\n getValue: () => Promise<T>,\n options?: AtomOptions<AsyncAtomState<T>>,\n): ReadonlyAtom<AsyncAtomState<T>> {\n const ref: { current?: InternalAtom<AsyncAtomState<T>> } = {}\n const atom = createAtom<AsyncAtomState<T>>(() => {\n getValue().then(\n (data) => {\n const internalAtom = ref.current!\n if (internalAtom._update({ status: 'done', data })) {\n const subs = internalAtom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n },\n (error) => {\n const internalAtom = ref.current!\n if (internalAtom._update({ status: 'error', error })) {\n const subs = internalAtom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n },\n )\n\n return { status: 'pending' }\n }, options)\n ref.current = atom as unknown as InternalAtom<AsyncAtomState<T>>\n\n return atom\n}\n\nexport function createAtom<T>(\n getValue: (prev?: NoInfer<T>) => T,\n options?: AtomOptions<T>,\n): ReadonlyAtom<T>\nexport function createAtom<T>(\n initialValue: T,\n options?: AtomOptions<T>,\n): Atom<T>\nexport function createAtom<T>(\n valueOrFn: T | ((prev?: T) => T),\n options?: AtomOptions<T>,\n): Atom<T> | ReadonlyAtom<T> {\n const isComputed = typeof valueOrFn === 'function'\n const getter = valueOrFn as (prev?: T) => T\n\n // Create plain object atom\n const atom: InternalAtom<T> = {\n _snapshot: isComputed ? undefined! : valueOrFn,\n\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: isComputed ? ReactiveFlags.None : ReactiveFlags.Mutable,\n\n get(): T {\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle)\n }\n return atom._snapshot\n },\n\n subscribe(observerOrFn: Observer<T> | ((value: T) => void)) {\n const obs = toObserver(observerOrFn)\n const observed = { current: false }\n const e = effect(() => {\n atom.get()\n if (!observed.current) {\n observed.current = true\n } else {\n obs.next?.(atom._snapshot)\n }\n })\n\n return {\n unsubscribe: () => {\n e.stop()\n },\n }\n },\n _update(getValue?: T | ((snapshot: T) => T)): boolean {\n const prevSub = activeSub\n const compare = options?.compare ?? Object.is\n if (isComputed) {\n activeSub = atom\n ++cycle\n atom.depsTail = undefined\n } else if (getValue === undefined) {\n // Mutable atoms can be marked dirty by the reactive graph, but they should\n // never be recomputed without an explicit value/updater.\n return false\n }\n if (isComputed) {\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck\n }\n try {\n const oldValue = atom._snapshot\n const newValue =\n typeof getValue === 'function'\n ? (getValue as (snapshot: T) => T)(oldValue)\n : getValue === undefined && isComputed\n ? getter(oldValue)\n : getValue!\n if (oldValue === undefined || !compare(oldValue, newValue)) {\n atom._snapshot = newValue\n return true\n }\n return false\n } finally {\n activeSub = prevSub\n if (isComputed) {\n atom.flags &= ~ReactiveFlags.RecursedCheck\n }\n purgeDeps(atom)\n }\n },\n }\n\n if (isComputed) {\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n atom.get = function (): T {\n const flags = atom.flags\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending && checkDirty(atom.deps!, atom))\n ) {\n if (atom._update()) {\n const subs = atom.subs\n if (subs !== undefined) {\n shallowPropagate(subs)\n }\n }\n } else if (flags & ReactiveFlags.Pending) {\n atom.flags = flags & ~ReactiveFlags.Pending\n }\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle)\n }\n return atom._snapshot\n }\n } else {\n ;(atom as unknown as Atom<T>).set = function (\n // eslint-disable-next-line no-shadow\n valueOrFn: T | ((prev: T) => T),\n ): void {\n if (atom._update(valueOrFn)) {\n const subs = atom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n }\n }\n\n return atom as unknown as Atom<T> | ReadonlyAtom<T>\n}\n\ninterface Effect extends ReactiveNode {\n notify: () => void\n stop: () => void\n}\n\nfunction effect<T>(fn: () => T): Effect {\n const run = (): T => {\n const prevSub = activeSub\n activeSub = effectObj\n ++cycle\n effectObj.depsTail = undefined\n effectObj.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck\n try {\n return fn()\n } finally {\n activeSub = prevSub\n effectObj.flags &= ~ReactiveFlags.RecursedCheck\n purgeDeps(effectObj)\n }\n }\n const effectObj: Effect = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck,\n\n notify(): void {\n const flags = this.flags\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending && checkDirty(this.deps!, this))\n ) {\n run()\n } else {\n this.flags = ReactiveFlags.Watching\n }\n },\n\n stop(): void {\n this.flags = ReactiveFlags.None\n this.depsTail = undefined\n purgeDeps(this)\n },\n }\n\n run()\n\n return effectObj\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"atom.cjs","names":[],"sources":["../src/atom.ts"],"sourcesContent":["import {\n DIRTY,\n MUTABLE,\n NONE,\n PENDING,\n RECURSED_CHECK,\n WATCHING,\n createReactiveSystem,\n} from './alien'\n\nimport type { ReactiveNode } from './alien'\nimport type {\n Atom,\n AtomOptions,\n Observer,\n ReadonlyAtom,\n Subscription,\n} from './types'\n\nexport function toObserver<T>(\n nextHandler?: Observer<T> | ((value: T) => void),\n errorHandler?: (error: any) => void,\n completionHandler?: () => void,\n): Observer<T> {\n const isObserver = typeof nextHandler === 'object'\n const self = isObserver ? nextHandler : undefined\n\n return {\n next: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n error: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n complete: (isObserver ? nextHandler.complete : completionHandler)?.bind(\n self,\n ),\n }\n}\n\ninterface InternalAtom<T> extends ReactiveNode {\n _snapshot: T\n _update: (getValue?: T | ((snapshot: T) => T)) => boolean\n get: () => T\n subscribe: (observerOrFn: Observer<T> | ((value: T) => void)) => Subscription\n}\n\nconst queuedEffects: Array<Effect | undefined> = []\nlet cycle = 0\nconst { link, unlink, propagate, checkDirty, shallowPropagate } =\n createReactiveSystem({\n update(atom: InternalAtom<any>): boolean {\n return atom._update()\n },\n // eslint-disable-next-line no-shadow\n notify(effect: Effect): void {\n queuedEffects[queuedEffectsLength++] = effect\n effect.flags &= ~WATCHING\n },\n unwatched(atom: InternalAtom<any>): void {\n if (atom.depsTail !== undefined) {\n atom.depsTail = undefined\n atom.flags = MUTABLE | DIRTY\n purgeDeps(atom)\n }\n },\n })\n\nlet notifyIndex = 0\nlet queuedEffectsLength = 0\nlet activeSub: ReactiveNode | undefined\nlet batchDepth = 0\n\nexport function batch(fn: () => void) {\n try {\n ++batchDepth\n fn()\n } finally {\n if (!--batchDepth) {\n flush()\n }\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\nexport function flush(): void {\n if (batchDepth > 0) {\n return\n }\n while (notifyIndex < queuedEffectsLength) {\n // eslint-disable-next-line no-shadow\n const effect = queuedEffects[notifyIndex]!\n queuedEffects[notifyIndex++] = undefined\n effect.notify()\n }\n notifyIndex = 0\n queuedEffectsLength = 0\n}\n\ntype AsyncAtomState<TData, TError = unknown> =\n | { status: 'pending' }\n | { status: 'done'; data: TData }\n | { status: 'error'; error: TError }\n\nexport function createAsyncAtom<T>(\n getValue: () => Promise<T>,\n options?: AtomOptions<AsyncAtomState<T>>,\n): ReadonlyAtom<AsyncAtomState<T>> {\n const ref: { current?: InternalAtom<AsyncAtomState<T>> } = {}\n const atom = createAtom<AsyncAtomState<T>>(() => {\n getValue().then(\n (data) => {\n const internalAtom = ref.current!\n if (internalAtom._update({ status: 'done', data })) {\n const subs = internalAtom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n },\n (error) => {\n const internalAtom = ref.current!\n if (internalAtom._update({ status: 'error', error })) {\n const subs = internalAtom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n },\n )\n\n return { status: 'pending' }\n }, options)\n ref.current = atom as unknown as InternalAtom<AsyncAtomState<T>>\n\n return atom\n}\n\nexport function createAtom<T>(\n getValue: (prev?: NoInfer<T>) => T,\n options?: AtomOptions<T>,\n): ReadonlyAtom<T>\nexport function createAtom<T>(\n initialValue: T,\n options?: AtomOptions<T>,\n): Atom<T>\nexport function createAtom<T>(\n valueOrFn: T | ((prev?: T) => T),\n options?: AtomOptions<T>,\n): Atom<T> | ReadonlyAtom<T> {\n const isComputed = typeof valueOrFn === 'function'\n const getter = valueOrFn as (prev?: T) => T\n\n // Create plain object atom\n const atom: InternalAtom<T> = {\n _snapshot: isComputed ? undefined! : valueOrFn,\n\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: isComputed ? NONE : MUTABLE,\n\n get(): T {\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle)\n }\n return atom._snapshot\n },\n\n subscribe(observerOrFn: Observer<T> | ((value: T) => void)) {\n const obs = toObserver(observerOrFn)\n const observed = { current: false }\n const e = effect(() => {\n atom.get()\n if (!observed.current) {\n observed.current = true\n } else {\n obs.next?.(atom._snapshot)\n }\n })\n\n return {\n unsubscribe: () => {\n e.stop()\n },\n }\n },\n _update(getValue?: T | ((snapshot: T) => T)): boolean {\n const prevSub = activeSub\n const compare = options?.compare ?? Object.is\n if (isComputed) {\n activeSub = atom\n ++cycle\n atom.depsTail = undefined\n } else if (getValue === undefined) {\n // Mutable atoms can be marked dirty by the reactive graph, but they should\n // never be recomputed without an explicit value/updater.\n return false\n }\n if (isComputed) {\n atom.flags = MUTABLE | RECURSED_CHECK\n }\n try {\n const oldValue = atom._snapshot\n const newValue =\n typeof getValue === 'function'\n ? (getValue as (snapshot: T) => T)(oldValue)\n : getValue === undefined && isComputed\n ? getter(oldValue)\n : getValue!\n if (oldValue === undefined || !compare(oldValue, newValue)) {\n atom._snapshot = newValue\n return true\n }\n return false\n } finally {\n activeSub = prevSub\n if (isComputed) {\n atom.flags &= ~RECURSED_CHECK\n }\n purgeDeps(atom)\n }\n },\n }\n\n if (isComputed) {\n atom.flags = MUTABLE | DIRTY\n atom.get = function (): T {\n const flags = atom.flags\n if (flags & DIRTY || (flags & PENDING && checkDirty(atom.deps!, atom))) {\n if (atom._update()) {\n const subs = atom.subs\n if (subs !== undefined) {\n shallowPropagate(subs)\n }\n }\n } else if (flags & PENDING) {\n atom.flags = flags & ~PENDING\n }\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle)\n }\n return atom._snapshot\n }\n } else {\n ;(atom as unknown as Atom<T>).set = function (\n // eslint-disable-next-line no-shadow\n valueOrFn: T | ((prev: T) => T),\n ): void {\n if (atom._update(valueOrFn)) {\n const subs = atom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n }\n }\n\n return atom as unknown as Atom<T> | ReadonlyAtom<T>\n}\n\ninterface Effect extends ReactiveNode {\n notify: () => void\n stop: () => void\n}\n\nfunction effect<T>(fn: () => T): Effect {\n const run = (): T => {\n const prevSub = activeSub\n activeSub = effectObj\n ++cycle\n effectObj.depsTail = undefined\n effectObj.flags = WATCHING | RECURSED_CHECK\n try {\n return fn()\n } finally {\n activeSub = prevSub\n effectObj.flags &= ~RECURSED_CHECK\n purgeDeps(effectObj)\n }\n }\n const effectObj: Effect = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: WATCHING | RECURSED_CHECK,\n\n notify(): void {\n const flags = this.flags\n if (flags & DIRTY || (flags & PENDING && checkDirty(this.deps!, this))) {\n run()\n } else {\n this.flags = WATCHING\n }\n },\n\n stop(): void {\n this.flags = NONE\n this.depsTail = undefined\n purgeDeps(this)\n },\n }\n\n run()\n\n return effectObj\n}\n"],"mappings":"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"} |
+15
-15
@@ -1,2 +0,2 @@ | ||
| import { ReactiveFlags, createReactiveSystem } from "./alien.js"; | ||
| import { createReactiveSystem } from "./alien.js"; | ||
@@ -21,3 +21,3 @@ //#region src/atom.ts | ||
| queuedEffects[queuedEffectsLength++] = effect; | ||
| effect.flags &= ~ReactiveFlags.Watching; | ||
| effect.flags &= ~2; | ||
| }, | ||
@@ -27,3 +27,3 @@ unwatched(atom) { | ||
| atom.depsTail = void 0; | ||
| atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty; | ||
| atom.flags = 1 | 16; | ||
| purgeDeps(atom); | ||
@@ -104,3 +104,3 @@ } | ||
| depsTail: void 0, | ||
| flags: isComputed ? ReactiveFlags.None : ReactiveFlags.Mutable, | ||
| flags: isComputed ? 0 : 1, | ||
| get() { | ||
@@ -130,3 +130,3 @@ if (activeSub !== void 0) link(atom, activeSub, cycle); | ||
| } else if (getValue === void 0) return false; | ||
| if (isComputed) atom.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck; | ||
| if (isComputed) atom.flags = 1 | 4; | ||
| try { | ||
@@ -142,3 +142,3 @@ const oldValue = atom._snapshot; | ||
| activeSub = prevSub; | ||
| if (isComputed) atom.flags &= ~ReactiveFlags.RecursedCheck; | ||
| if (isComputed) atom.flags &= ~4; | ||
| purgeDeps(atom); | ||
@@ -149,6 +149,6 @@ } | ||
| if (isComputed) { | ||
| atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty; | ||
| atom.flags = 1 | 16; | ||
| atom.get = function() { | ||
| const flags = atom.flags; | ||
| if (flags & ReactiveFlags.Dirty || flags & ReactiveFlags.Pending && checkDirty(atom.deps, atom)) { | ||
| if (flags & 16 || flags & 32 && checkDirty(atom.deps, atom)) { | ||
| if (atom._update()) { | ||
@@ -158,3 +158,3 @@ const subs = atom.subs; | ||
| } | ||
| } else if (flags & ReactiveFlags.Pending) atom.flags = flags & ~ReactiveFlags.Pending; | ||
| } else if (flags & 32) atom.flags = flags & ~32; | ||
| if (activeSub !== void 0) link(atom, activeSub, cycle); | ||
@@ -181,3 +181,3 @@ return atom._snapshot; | ||
| effectObj.depsTail = void 0; | ||
| effectObj.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck; | ||
| effectObj.flags = 2 | 4; | ||
| try { | ||
@@ -187,3 +187,3 @@ return fn(); | ||
| activeSub = prevSub; | ||
| effectObj.flags &= ~ReactiveFlags.RecursedCheck; | ||
| effectObj.flags &= ~4; | ||
| purgeDeps(effectObj); | ||
@@ -197,10 +197,10 @@ } | ||
| subsTail: void 0, | ||
| flags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck, | ||
| flags: 2 | 4, | ||
| notify() { | ||
| const flags = this.flags; | ||
| if (flags & ReactiveFlags.Dirty || flags & ReactiveFlags.Pending && checkDirty(this.deps, this)) run(); | ||
| else this.flags = ReactiveFlags.Watching; | ||
| if (flags & 16 || flags & 32 && checkDirty(this.deps, this)) run(); | ||
| else this.flags = 2; | ||
| }, | ||
| stop() { | ||
| this.flags = ReactiveFlags.None; | ||
| this.flags = 0; | ||
| this.depsTail = void 0; | ||
@@ -207,0 +207,0 @@ purgeDeps(this); |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"atom.js","names":[],"sources":["../src/atom.ts"],"sourcesContent":["import { ReactiveFlags, createReactiveSystem } from './alien'\n\nimport type { ReactiveNode } from './alien'\nimport type {\n Atom,\n AtomOptions,\n Observer,\n ReadonlyAtom,\n Subscription,\n} from './types'\n\nexport function toObserver<T>(\n nextHandler?: Observer<T> | ((value: T) => void),\n errorHandler?: (error: any) => void,\n completionHandler?: () => void,\n): Observer<T> {\n const isObserver = typeof nextHandler === 'object'\n const self = isObserver ? nextHandler : undefined\n\n return {\n next: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n error: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n complete: (isObserver ? nextHandler.complete : completionHandler)?.bind(\n self,\n ),\n }\n}\n\ninterface InternalAtom<T> extends ReactiveNode {\n _snapshot: T\n _update: (getValue?: T | ((snapshot: T) => T)) => boolean\n get: () => T\n subscribe: (observerOrFn: Observer<T> | ((value: T) => void)) => Subscription\n}\n\nconst queuedEffects: Array<Effect | undefined> = []\nlet cycle = 0\nconst { link, unlink, propagate, checkDirty, shallowPropagate } =\n createReactiveSystem({\n update(atom: InternalAtom<any>): boolean {\n return atom._update()\n },\n // eslint-disable-next-line no-shadow\n notify(effect: Effect): void {\n queuedEffects[queuedEffectsLength++] = effect\n effect.flags &= ~ReactiveFlags.Watching\n },\n unwatched(atom: InternalAtom<any>): void {\n if (atom.depsTail !== undefined) {\n atom.depsTail = undefined\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n purgeDeps(atom)\n }\n },\n })\n\nlet notifyIndex = 0\nlet queuedEffectsLength = 0\nlet activeSub: ReactiveNode | undefined\nlet batchDepth = 0\n\nexport function batch(fn: () => void) {\n try {\n ++batchDepth\n fn()\n } finally {\n if (!--batchDepth) {\n flush()\n }\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\nexport function flush(): void {\n if (batchDepth > 0) {\n return\n }\n while (notifyIndex < queuedEffectsLength) {\n // eslint-disable-next-line no-shadow\n const effect = queuedEffects[notifyIndex]!\n queuedEffects[notifyIndex++] = undefined\n effect.notify()\n }\n notifyIndex = 0\n queuedEffectsLength = 0\n}\n\ntype AsyncAtomState<TData, TError = unknown> =\n | { status: 'pending' }\n | { status: 'done'; data: TData }\n | { status: 'error'; error: TError }\n\nexport function createAsyncAtom<T>(\n getValue: () => Promise<T>,\n options?: AtomOptions<AsyncAtomState<T>>,\n): ReadonlyAtom<AsyncAtomState<T>> {\n const ref: { current?: InternalAtom<AsyncAtomState<T>> } = {}\n const atom = createAtom<AsyncAtomState<T>>(() => {\n getValue().then(\n (data) => {\n const internalAtom = ref.current!\n if (internalAtom._update({ status: 'done', data })) {\n const subs = internalAtom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n },\n (error) => {\n const internalAtom = ref.current!\n if (internalAtom._update({ status: 'error', error })) {\n const subs = internalAtom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n },\n )\n\n return { status: 'pending' }\n }, options)\n ref.current = atom as unknown as InternalAtom<AsyncAtomState<T>>\n\n return atom\n}\n\nexport function createAtom<T>(\n getValue: (prev?: NoInfer<T>) => T,\n options?: AtomOptions<T>,\n): ReadonlyAtom<T>\nexport function createAtom<T>(\n initialValue: T,\n options?: AtomOptions<T>,\n): Atom<T>\nexport function createAtom<T>(\n valueOrFn: T | ((prev?: T) => T),\n options?: AtomOptions<T>,\n): Atom<T> | ReadonlyAtom<T> {\n const isComputed = typeof valueOrFn === 'function'\n const getter = valueOrFn as (prev?: T) => T\n\n // Create plain object atom\n const atom: InternalAtom<T> = {\n _snapshot: isComputed ? undefined! : valueOrFn,\n\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: isComputed ? ReactiveFlags.None : ReactiveFlags.Mutable,\n\n get(): T {\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle)\n }\n return atom._snapshot\n },\n\n subscribe(observerOrFn: Observer<T> | ((value: T) => void)) {\n const obs = toObserver(observerOrFn)\n const observed = { current: false }\n const e = effect(() => {\n atom.get()\n if (!observed.current) {\n observed.current = true\n } else {\n obs.next?.(atom._snapshot)\n }\n })\n\n return {\n unsubscribe: () => {\n e.stop()\n },\n }\n },\n _update(getValue?: T | ((snapshot: T) => T)): boolean {\n const prevSub = activeSub\n const compare = options?.compare ?? Object.is\n if (isComputed) {\n activeSub = atom\n ++cycle\n atom.depsTail = undefined\n } else if (getValue === undefined) {\n // Mutable atoms can be marked dirty by the reactive graph, but they should\n // never be recomputed without an explicit value/updater.\n return false\n }\n if (isComputed) {\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck\n }\n try {\n const oldValue = atom._snapshot\n const newValue =\n typeof getValue === 'function'\n ? (getValue as (snapshot: T) => T)(oldValue)\n : getValue === undefined && isComputed\n ? getter(oldValue)\n : getValue!\n if (oldValue === undefined || !compare(oldValue, newValue)) {\n atom._snapshot = newValue\n return true\n }\n return false\n } finally {\n activeSub = prevSub\n if (isComputed) {\n atom.flags &= ~ReactiveFlags.RecursedCheck\n }\n purgeDeps(atom)\n }\n },\n }\n\n if (isComputed) {\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n atom.get = function (): T {\n const flags = atom.flags\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending && checkDirty(atom.deps!, atom))\n ) {\n if (atom._update()) {\n const subs = atom.subs\n if (subs !== undefined) {\n shallowPropagate(subs)\n }\n }\n } else if (flags & ReactiveFlags.Pending) {\n atom.flags = flags & ~ReactiveFlags.Pending\n }\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle)\n }\n return atom._snapshot\n }\n } else {\n ;(atom as unknown as Atom<T>).set = function (\n // eslint-disable-next-line no-shadow\n valueOrFn: T | ((prev: T) => T),\n ): void {\n if (atom._update(valueOrFn)) {\n const subs = atom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n }\n }\n\n return atom as unknown as Atom<T> | ReadonlyAtom<T>\n}\n\ninterface Effect extends ReactiveNode {\n notify: () => void\n stop: () => void\n}\n\nfunction effect<T>(fn: () => T): Effect {\n const run = (): T => {\n const prevSub = activeSub\n activeSub = effectObj\n ++cycle\n effectObj.depsTail = undefined\n effectObj.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck\n try {\n return fn()\n } finally {\n activeSub = prevSub\n effectObj.flags &= ~ReactiveFlags.RecursedCheck\n purgeDeps(effectObj)\n }\n }\n const effectObj: Effect = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck,\n\n notify(): void {\n const flags = this.flags\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending && checkDirty(this.deps!, this))\n ) {\n run()\n } else {\n this.flags = ReactiveFlags.Watching\n }\n },\n\n stop(): void {\n this.flags = ReactiveFlags.None\n this.depsTail = undefined\n purgeDeps(this)\n },\n }\n\n run()\n\n return effectObj\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"atom.js","names":[],"sources":["../src/atom.ts"],"sourcesContent":["import {\n DIRTY,\n MUTABLE,\n NONE,\n PENDING,\n RECURSED_CHECK,\n WATCHING,\n createReactiveSystem,\n} from './alien'\n\nimport type { ReactiveNode } from './alien'\nimport type {\n Atom,\n AtomOptions,\n Observer,\n ReadonlyAtom,\n Subscription,\n} from './types'\n\nexport function toObserver<T>(\n nextHandler?: Observer<T> | ((value: T) => void),\n errorHandler?: (error: any) => void,\n completionHandler?: () => void,\n): Observer<T> {\n const isObserver = typeof nextHandler === 'object'\n const self = isObserver ? nextHandler : undefined\n\n return {\n next: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n error: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n complete: (isObserver ? nextHandler.complete : completionHandler)?.bind(\n self,\n ),\n }\n}\n\ninterface InternalAtom<T> extends ReactiveNode {\n _snapshot: T\n _update: (getValue?: T | ((snapshot: T) => T)) => boolean\n get: () => T\n subscribe: (observerOrFn: Observer<T> | ((value: T) => void)) => Subscription\n}\n\nconst queuedEffects: Array<Effect | undefined> = []\nlet cycle = 0\nconst { link, unlink, propagate, checkDirty, shallowPropagate } =\n createReactiveSystem({\n update(atom: InternalAtom<any>): boolean {\n return atom._update()\n },\n // eslint-disable-next-line no-shadow\n notify(effect: Effect): void {\n queuedEffects[queuedEffectsLength++] = effect\n effect.flags &= ~WATCHING\n },\n unwatched(atom: InternalAtom<any>): void {\n if (atom.depsTail !== undefined) {\n atom.depsTail = undefined\n atom.flags = MUTABLE | DIRTY\n purgeDeps(atom)\n }\n },\n })\n\nlet notifyIndex = 0\nlet queuedEffectsLength = 0\nlet activeSub: ReactiveNode | undefined\nlet batchDepth = 0\n\nexport function batch(fn: () => void) {\n try {\n ++batchDepth\n fn()\n } finally {\n if (!--batchDepth) {\n flush()\n }\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\nexport function flush(): void {\n if (batchDepth > 0) {\n return\n }\n while (notifyIndex < queuedEffectsLength) {\n // eslint-disable-next-line no-shadow\n const effect = queuedEffects[notifyIndex]!\n queuedEffects[notifyIndex++] = undefined\n effect.notify()\n }\n notifyIndex = 0\n queuedEffectsLength = 0\n}\n\ntype AsyncAtomState<TData, TError = unknown> =\n | { status: 'pending' }\n | { status: 'done'; data: TData }\n | { status: 'error'; error: TError }\n\nexport function createAsyncAtom<T>(\n getValue: () => Promise<T>,\n options?: AtomOptions<AsyncAtomState<T>>,\n): ReadonlyAtom<AsyncAtomState<T>> {\n const ref: { current?: InternalAtom<AsyncAtomState<T>> } = {}\n const atom = createAtom<AsyncAtomState<T>>(() => {\n getValue().then(\n (data) => {\n const internalAtom = ref.current!\n if (internalAtom._update({ status: 'done', data })) {\n const subs = internalAtom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n },\n (error) => {\n const internalAtom = ref.current!\n if (internalAtom._update({ status: 'error', error })) {\n const subs = internalAtom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n },\n )\n\n return { status: 'pending' }\n }, options)\n ref.current = atom as unknown as InternalAtom<AsyncAtomState<T>>\n\n return atom\n}\n\nexport function createAtom<T>(\n getValue: (prev?: NoInfer<T>) => T,\n options?: AtomOptions<T>,\n): ReadonlyAtom<T>\nexport function createAtom<T>(\n initialValue: T,\n options?: AtomOptions<T>,\n): Atom<T>\nexport function createAtom<T>(\n valueOrFn: T | ((prev?: T) => T),\n options?: AtomOptions<T>,\n): Atom<T> | ReadonlyAtom<T> {\n const isComputed = typeof valueOrFn === 'function'\n const getter = valueOrFn as (prev?: T) => T\n\n // Create plain object atom\n const atom: InternalAtom<T> = {\n _snapshot: isComputed ? undefined! : valueOrFn,\n\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: isComputed ? NONE : MUTABLE,\n\n get(): T {\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle)\n }\n return atom._snapshot\n },\n\n subscribe(observerOrFn: Observer<T> | ((value: T) => void)) {\n const obs = toObserver(observerOrFn)\n const observed = { current: false }\n const e = effect(() => {\n atom.get()\n if (!observed.current) {\n observed.current = true\n } else {\n obs.next?.(atom._snapshot)\n }\n })\n\n return {\n unsubscribe: () => {\n e.stop()\n },\n }\n },\n _update(getValue?: T | ((snapshot: T) => T)): boolean {\n const prevSub = activeSub\n const compare = options?.compare ?? Object.is\n if (isComputed) {\n activeSub = atom\n ++cycle\n atom.depsTail = undefined\n } else if (getValue === undefined) {\n // Mutable atoms can be marked dirty by the reactive graph, but they should\n // never be recomputed without an explicit value/updater.\n return false\n }\n if (isComputed) {\n atom.flags = MUTABLE | RECURSED_CHECK\n }\n try {\n const oldValue = atom._snapshot\n const newValue =\n typeof getValue === 'function'\n ? (getValue as (snapshot: T) => T)(oldValue)\n : getValue === undefined && isComputed\n ? getter(oldValue)\n : getValue!\n if (oldValue === undefined || !compare(oldValue, newValue)) {\n atom._snapshot = newValue\n return true\n }\n return false\n } finally {\n activeSub = prevSub\n if (isComputed) {\n atom.flags &= ~RECURSED_CHECK\n }\n purgeDeps(atom)\n }\n },\n }\n\n if (isComputed) {\n atom.flags = MUTABLE | DIRTY\n atom.get = function (): T {\n const flags = atom.flags\n if (flags & DIRTY || (flags & PENDING && checkDirty(atom.deps!, atom))) {\n if (atom._update()) {\n const subs = atom.subs\n if (subs !== undefined) {\n shallowPropagate(subs)\n }\n }\n } else if (flags & PENDING) {\n atom.flags = flags & ~PENDING\n }\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle)\n }\n return atom._snapshot\n }\n } else {\n ;(atom as unknown as Atom<T>).set = function (\n // eslint-disable-next-line no-shadow\n valueOrFn: T | ((prev: T) => T),\n ): void {\n if (atom._update(valueOrFn)) {\n const subs = atom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n }\n }\n\n return atom as unknown as Atom<T> | ReadonlyAtom<T>\n}\n\ninterface Effect extends ReactiveNode {\n notify: () => void\n stop: () => void\n}\n\nfunction effect<T>(fn: () => T): Effect {\n const run = (): T => {\n const prevSub = activeSub\n activeSub = effectObj\n ++cycle\n effectObj.depsTail = undefined\n effectObj.flags = WATCHING | RECURSED_CHECK\n try {\n return fn()\n } finally {\n activeSub = prevSub\n effectObj.flags &= ~RECURSED_CHECK\n purgeDeps(effectObj)\n }\n }\n const effectObj: Effect = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: WATCHING | RECURSED_CHECK,\n\n notify(): void {\n const flags = this.flags\n if (flags & DIRTY || (flags & PENDING && checkDirty(this.deps!, this))) {\n run()\n } else {\n this.flags = WATCHING\n }\n },\n\n stop(): void {\n this.flags = NONE\n this.depsTail = undefined\n purgeDeps(this)\n },\n }\n\n run()\n\n return effectObj\n}\n"],"mappings":"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"} |
+1
-1
| { | ||
| "name": "@tanstack/store", | ||
| "version": "0.11.0", | ||
| "version": "0.11.1", | ||
| "description": "Framework agnostic type-safe store w/ reactive framework adapters", | ||
@@ -5,0 +5,0 @@ "author": "Tanner Linsley", |
+28
-53
@@ -28,11 +28,11 @@ /* eslint-disable */ | ||
| export const enum ReactiveFlags { | ||
| None = 0, | ||
| Mutable = 1, | ||
| Watching = 2, | ||
| RecursedCheck = 4, | ||
| Recursed = 8, | ||
| Dirty = 16, | ||
| Pending = 32, | ||
| } | ||
| export type ReactiveFlags = number | ||
| export const NONE = 0 | ||
| export const MUTABLE = 1 | ||
| export const WATCHING = 2 | ||
| export const RECURSED_CHECK = 4 | ||
| export const RECURSED = 8 | ||
| export const DIRTY = 16 | ||
| export const PENDING = 32 | ||
| /*@__NO_SIDE_EFFECTS__*/ | ||
@@ -139,33 +139,20 @@ export function createReactiveSystem({ | ||
| if ( | ||
| !( | ||
| flags & | ||
| (ReactiveFlags.RecursedCheck | | ||
| ReactiveFlags.Recursed | | ||
| ReactiveFlags.Dirty | | ||
| ReactiveFlags.Pending) | ||
| ) | ||
| ) { | ||
| sub.flags = flags | ReactiveFlags.Pending | ||
| } else if ( | ||
| !(flags & (ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed)) | ||
| ) { | ||
| flags = ReactiveFlags.None | ||
| } else if (!(flags & ReactiveFlags.RecursedCheck)) { | ||
| sub.flags = (flags & ~ReactiveFlags.Recursed) | ReactiveFlags.Pending | ||
| } else if ( | ||
| !(flags & (ReactiveFlags.Dirty | ReactiveFlags.Pending)) && | ||
| isValidLink(link, sub) | ||
| ) { | ||
| sub.flags = flags | (ReactiveFlags.Recursed | ReactiveFlags.Pending) | ||
| flags &= ReactiveFlags.Mutable | ||
| if (!(flags & (RECURSED_CHECK | RECURSED | DIRTY | PENDING))) { | ||
| sub.flags = flags | PENDING | ||
| } else if (!(flags & (RECURSED_CHECK | RECURSED))) { | ||
| flags = NONE | ||
| } else if (!(flags & RECURSED_CHECK)) { | ||
| sub.flags = (flags & ~RECURSED) | PENDING | ||
| } else if (!(flags & (DIRTY | PENDING)) && isValidLink(link, sub)) { | ||
| sub.flags = flags | (RECURSED | PENDING) | ||
| flags &= MUTABLE | ||
| } else { | ||
| flags = ReactiveFlags.None | ||
| flags = NONE | ||
| } | ||
| if (flags & ReactiveFlags.Watching) { | ||
| if (flags & WATCHING) { | ||
| notify(sub) | ||
| } | ||
| if (flags & ReactiveFlags.Mutable) { | ||
| if (flags & MUTABLE) { | ||
| const subSubs = sub.subs | ||
@@ -209,8 +196,5 @@ if (subSubs !== undefined) { | ||
| if (sub.flags & ReactiveFlags.Dirty) { | ||
| if (sub.flags & DIRTY) { | ||
| dirty = true | ||
| } else if ( | ||
| (flags & (ReactiveFlags.Mutable | ReactiveFlags.Dirty)) === | ||
| (ReactiveFlags.Mutable | ReactiveFlags.Dirty) | ||
| ) { | ||
| } else if ((flags & (MUTABLE | DIRTY)) === (MUTABLE | DIRTY)) { | ||
| if (update(dep)) { | ||
@@ -223,6 +207,3 @@ const subs = dep.subs! | ||
| } | ||
| } else if ( | ||
| (flags & (ReactiveFlags.Mutable | ReactiveFlags.Pending)) === | ||
| (ReactiveFlags.Mutable | ReactiveFlags.Pending) | ||
| ) { | ||
| } else if ((flags & (MUTABLE | PENDING)) === (MUTABLE | PENDING)) { | ||
| if (link.nextSub !== undefined || link.prevSub !== undefined) { | ||
@@ -264,3 +245,3 @@ stack = { value: link, prev: stack } | ||
| } else { | ||
| sub.flags &= ~ReactiveFlags.Pending | ||
| sub.flags &= ~PENDING | ||
| } | ||
@@ -283,11 +264,5 @@ sub = link.sub | ||
| const flags = sub.flags | ||
| if ( | ||
| (flags & (ReactiveFlags.Pending | ReactiveFlags.Dirty)) === | ||
| ReactiveFlags.Pending | ||
| ) { | ||
| sub.flags = flags | ReactiveFlags.Dirty | ||
| if ( | ||
| (flags & (ReactiveFlags.Watching | ReactiveFlags.RecursedCheck)) === | ||
| ReactiveFlags.Watching | ||
| ) { | ||
| if ((flags & (PENDING | DIRTY)) === PENDING) { | ||
| sub.flags = flags | DIRTY | ||
| if ((flags & (WATCHING | RECURSED_CHECK)) === WATCHING) { | ||
| notify(sub) | ||
@@ -294,0 +269,0 @@ } |
+24
-22
@@ -1,2 +0,10 @@ | ||
| import { ReactiveFlags, createReactiveSystem } from './alien' | ||
| import { | ||
| DIRTY, | ||
| MUTABLE, | ||
| NONE, | ||
| PENDING, | ||
| RECURSED_CHECK, | ||
| WATCHING, | ||
| createReactiveSystem, | ||
| } from './alien' | ||
@@ -46,3 +54,3 @@ import type { ReactiveNode } from './alien' | ||
| queuedEffects[queuedEffectsLength++] = effect | ||
| effect.flags &= ~ReactiveFlags.Watching | ||
| effect.flags &= ~WATCHING | ||
| }, | ||
@@ -52,3 +60,3 @@ unwatched(atom: InternalAtom<any>): void { | ||
| atom.depsTail = undefined | ||
| atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty | ||
| atom.flags = MUTABLE | DIRTY | ||
| purgeDeps(atom) | ||
@@ -163,3 +171,3 @@ } | ||
| depsTail: undefined, | ||
| flags: isComputed ? ReactiveFlags.None : ReactiveFlags.Mutable, | ||
| flags: isComputed ? NONE : MUTABLE, | ||
@@ -204,3 +212,3 @@ get(): T { | ||
| if (isComputed) { | ||
| atom.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck | ||
| atom.flags = MUTABLE | RECURSED_CHECK | ||
| } | ||
@@ -223,3 +231,3 @@ try { | ||
| if (isComputed) { | ||
| atom.flags &= ~ReactiveFlags.RecursedCheck | ||
| atom.flags &= ~RECURSED_CHECK | ||
| } | ||
@@ -232,9 +240,6 @@ purgeDeps(atom) | ||
| if (isComputed) { | ||
| atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty | ||
| atom.flags = MUTABLE | DIRTY | ||
| atom.get = function (): T { | ||
| const flags = atom.flags | ||
| if ( | ||
| flags & ReactiveFlags.Dirty || | ||
| (flags & ReactiveFlags.Pending && checkDirty(atom.deps!, atom)) | ||
| ) { | ||
| if (flags & DIRTY || (flags & PENDING && checkDirty(atom.deps!, atom))) { | ||
| if (atom._update()) { | ||
@@ -246,4 +251,4 @@ const subs = atom.subs | ||
| } | ||
| } else if (flags & ReactiveFlags.Pending) { | ||
| atom.flags = flags & ~ReactiveFlags.Pending | ||
| } else if (flags & PENDING) { | ||
| atom.flags = flags & ~PENDING | ||
| } | ||
@@ -285,3 +290,3 @@ if (activeSub !== undefined) { | ||
| effectObj.depsTail = undefined | ||
| effectObj.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck | ||
| effectObj.flags = WATCHING | RECURSED_CHECK | ||
| try { | ||
@@ -291,3 +296,3 @@ return fn() | ||
| activeSub = prevSub | ||
| effectObj.flags &= ~ReactiveFlags.RecursedCheck | ||
| effectObj.flags &= ~RECURSED_CHECK | ||
| purgeDeps(effectObj) | ||
@@ -301,13 +306,10 @@ } | ||
| subsTail: undefined, | ||
| flags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck, | ||
| flags: WATCHING | RECURSED_CHECK, | ||
| notify(): void { | ||
| const flags = this.flags | ||
| if ( | ||
| flags & ReactiveFlags.Dirty || | ||
| (flags & ReactiveFlags.Pending && checkDirty(this.deps!, this)) | ||
| ) { | ||
| if (flags & DIRTY || (flags & PENDING && checkDirty(this.deps!, this))) { | ||
| run() | ||
| } else { | ||
| this.flags = ReactiveFlags.Watching | ||
| this.flags = WATCHING | ||
| } | ||
@@ -317,3 +319,3 @@ }, | ||
| stop(): void { | ||
| this.flags = ReactiveFlags.None | ||
| this.flags = NONE | ||
| this.depsTail = undefined | ||
@@ -320,0 +322,0 @@ purgeDeps(this) |
+40
-34
@@ -5,8 +5,17 @@ /* eslint-disable */ | ||
| import { ReactiveFlags, createReactiveSystem } from './alien' | ||
| import { | ||
| DIRTY, | ||
| MUTABLE, | ||
| NONE, | ||
| PENDING, | ||
| RECURSED, | ||
| RECURSED_CHECK, | ||
| WATCHING, | ||
| createReactiveSystem, | ||
| } from './alien' | ||
| import type { ReactiveNode } from './alien' | ||
| export { ReactiveFlags, createReactiveSystem } from './alien' | ||
| export type { Link, ReactiveNode } from './alien' | ||
| export { createReactiveSystem } from './alien' | ||
| export type { Link, ReactiveFlags, ReactiveNode } from './alien' | ||
@@ -49,5 +58,5 @@ interface EffectNode extends ReactiveNode { | ||
| queued[insertIndex++] = effect | ||
| effect.flags &= ~ReactiveFlags.Watching | ||
| effect.flags &= ~WATCHING | ||
| effect = effect.subs?.sub as EffectNode | ||
| if (effect === undefined || !(effect.flags & ReactiveFlags.Watching)) { | ||
| if (effect === undefined || !(effect.flags & WATCHING)) { | ||
| break | ||
@@ -66,7 +75,7 @@ } | ||
| unwatched(node) { | ||
| if (!(node.flags & ReactiveFlags.Mutable)) { | ||
| if (!(node.flags & MUTABLE)) { | ||
| effectScopeOper.call(node) | ||
| } else if (node.depsTail !== undefined) { | ||
| node.depsTail = undefined | ||
| node.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty | ||
| node.flags = MUTABLE | DIRTY | ||
| purgeDeps(node) | ||
@@ -134,3 +143,3 @@ } | ||
| subsTail: undefined, | ||
| flags: ReactiveFlags.Mutable, | ||
| flags: MUTABLE, | ||
| }) as () => T | undefined | ||
@@ -146,3 +155,3 @@ } | ||
| depsTail: undefined, | ||
| flags: ReactiveFlags.None, | ||
| flags: NONE, | ||
| getter: getter as (previousValue?: unknown) => unknown, | ||
@@ -159,3 +168,3 @@ }) as () => T | ||
| depsTail: undefined, | ||
| flags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck, | ||
| flags: WATCHING | RECURSED_CHECK, | ||
| } | ||
@@ -170,3 +179,3 @@ const prevSub = setActiveSub(e) | ||
| activeSub = prevSub | ||
| e.flags &= ~ReactiveFlags.RecursedCheck | ||
| e.flags &= ~RECURSED_CHECK | ||
| } | ||
@@ -182,3 +191,3 @@ return effectOper.bind(e) | ||
| subsTail: undefined, | ||
| flags: ReactiveFlags.None, | ||
| flags: NONE, | ||
| } | ||
@@ -201,3 +210,3 @@ const prevSub = setActiveSub(e) | ||
| depsTail: undefined, | ||
| flags: ReactiveFlags.Watching, | ||
| flags: WATCHING, | ||
| } | ||
@@ -215,3 +224,3 @@ const prevSub = setActiveSub(sub) | ||
| if (subs !== undefined) { | ||
| sub.flags = ReactiveFlags.None | ||
| sub.flags = NONE | ||
| propagate(subs) | ||
@@ -230,3 +239,3 @@ shallowPropagate(subs) | ||
| c.depsTail = undefined | ||
| c.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck | ||
| c.flags = MUTABLE | RECURSED_CHECK | ||
| const prevSub = setActiveSub(c) | ||
@@ -238,3 +247,3 @@ try { | ||
| activeSub = prevSub | ||
| c.flags &= ~ReactiveFlags.RecursedCheck | ||
| c.flags &= ~RECURSED_CHECK | ||
| purgeDeps(c) | ||
@@ -245,3 +254,3 @@ } | ||
| function updateSignal(s: SignalNode): boolean { | ||
| s.flags = ReactiveFlags.Mutable | ||
| s.flags = MUTABLE | ||
| return s.currentValue !== (s.currentValue = s.pendingValue) | ||
@@ -252,9 +261,6 @@ } | ||
| const flags = e.flags | ||
| if ( | ||
| flags & ReactiveFlags.Dirty || | ||
| (flags & ReactiveFlags.Pending && checkDirty(e.deps!, e)) | ||
| ) { | ||
| if (flags & DIRTY || (flags & PENDING && checkDirty(e.deps!, e))) { | ||
| ++cycle | ||
| e.depsTail = undefined | ||
| e.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck | ||
| e.flags = WATCHING | RECURSED_CHECK | ||
| const prevSub = setActiveSub(e) | ||
@@ -265,7 +271,7 @@ try { | ||
| activeSub = prevSub | ||
| e.flags &= ~ReactiveFlags.RecursedCheck | ||
| e.flags &= ~RECURSED_CHECK | ||
| purgeDeps(e) | ||
| } | ||
| } else { | ||
| e.flags = ReactiveFlags.Watching | ||
| e.flags = WATCHING | ||
| } | ||
@@ -285,3 +291,3 @@ } | ||
| queued[notifyIndex++] = undefined | ||
| effect.flags |= ReactiveFlags.Watching | ReactiveFlags.Recursed | ||
| effect.flags |= WATCHING | RECURSED | ||
| } | ||
@@ -296,6 +302,6 @@ notifyIndex = 0 | ||
| if ( | ||
| flags & ReactiveFlags.Dirty || | ||
| (flags & ReactiveFlags.Pending && | ||
| flags & DIRTY || | ||
| (flags & PENDING && | ||
| (checkDirty(this.deps!, this) || | ||
| ((this.flags = flags & ~ReactiveFlags.Pending), false))) | ||
| ((this.flags = flags & ~PENDING), false))) | ||
| ) { | ||
@@ -309,3 +315,3 @@ if (updateComputed(this)) { | ||
| } else if (!flags) { | ||
| this.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck | ||
| this.flags = MUTABLE | RECURSED_CHECK | ||
| const prevSub = setActiveSub(this) | ||
@@ -316,3 +322,3 @@ try { | ||
| activeSub = prevSub | ||
| this.flags &= ~ReactiveFlags.RecursedCheck | ||
| this.flags &= ~RECURSED_CHECK | ||
| } | ||
@@ -330,3 +336,3 @@ } | ||
| if (this.pendingValue !== (this.pendingValue = value[0])) { | ||
| this.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty | ||
| this.flags = MUTABLE | DIRTY | ||
| const subs = this.subs | ||
@@ -341,3 +347,3 @@ if (subs !== undefined) { | ||
| } else { | ||
| if (this.flags & ReactiveFlags.Dirty) { | ||
| if (this.flags & DIRTY) { | ||
| if (updateSignal(this)) { | ||
@@ -352,3 +358,3 @@ const subs = this.subs | ||
| while (sub !== undefined) { | ||
| if (sub.flags & (ReactiveFlags.Mutable | ReactiveFlags.Watching)) { | ||
| if (sub.flags & (MUTABLE | WATCHING)) { | ||
| link(this, sub, cycle) | ||
@@ -369,3 +375,3 @@ break | ||
| this.depsTail = undefined | ||
| this.flags = ReactiveFlags.None | ||
| this.flags = NONE | ||
| purgeDeps(this) | ||
@@ -372,0 +378,0 @@ const sub = this.subs |
123093
-6.31%2142
-1.52%