@tanstack/store
Version:
Framework agnostic type-safe store w/ reactive framework adapters
1 lines • 10.6 kB
Source Map (JSON)
{"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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"}