Sign In

@tanstack/store

Package Overview
Dependencies
Maintainers
3
Versions
74
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@tanstack/store - npm Package Compare versions

Comparing version
0.11.0
to
0.11.1
+23
-27
dist/alien.cjs
//#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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"}

@@ -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

@@ -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
//#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":";AA2BA,IAAkB,gBAAX;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;KACD;;AAED,SAAgB,qBAAqB,EACnC,QACA,QACA,aAKC;AACD,QAAO;EACL;EACA;EACA;EACA;EACA;EACD;CAED,SAAS,KAAK,KAAmB,KAAmB,SAAuB;EACzE,MAAM,UAAU,IAAI;AACpB,MAAI,YAAY,UAAa,QAAQ,QAAQ,IAC3C;EAEF,MAAM,UAAU,YAAY,SAAY,QAAQ,UAAU,IAAI;AAC9D,MAAI,YAAY,UAAa,QAAQ,QAAQ,KAAK;AAChD,WAAQ,UAAU;AAClB,OAAI,WAAW;AACf;;EAEF,MAAM,UAAU,IAAI;AACpB,MACE,YAAY,UACZ,QAAQ,YAAY,WACpB,QAAQ,QAAQ,IAEhB;EAEF,MAAM,UACH,IAAI,WACL,IAAI,WACF;GACE;GACA;GACA;GACA;GACA;GACA;GACA,SAAS;GACV;AACL,MAAI,YAAY,OACd,SAAQ,UAAU;AAEpB,MAAI,YAAY,OACd,SAAQ,UAAU;MAElB,KAAI,OAAO;AAEb,MAAI,YAAY,OACd,SAAQ,UAAU;MAElB,KAAI,OAAO;;CAIf,SAAS,OAAO,MAAY,MAAM,KAAK,KAAuB;EAC5D,MAAM,MAAM,KAAK;EACjB,MAAM,UAAU,KAAK;EACrB,MAAM,UAAU,KAAK;EACrB,MAAM,UAAU,KAAK;EACrB,MAAM,UAAU,KAAK;AACrB,MAAI,YAAY,OACd,SAAQ,UAAU;MAElB,KAAI,WAAW;AAEjB,MAAI,YAAY,OACd,SAAQ,UAAU;MAElB,KAAI,OAAO;AAEb,MAAI,YAAY,OACd,SAAQ,UAAU;MAElB,KAAI,WAAW;AAEjB,MAAI,YAAY,OACd,SAAQ,UAAU;YACR,IAAI,OAAO,aAAa,OAClC,WAAU,IAAI;AAEhB,SAAO;;CAGT,SAAS,UAAU,MAAkB;EACnC,IAAI,OAAO,KAAK;EAChB,IAAI;AAEJ,MAAK,IAAG;GACN,MAAM,MAAM,KAAK;GACjB,IAAI,QAAQ,IAAI;AAEhB,OACE,EACE,SACC,cAAc,gBACb,cAAc,WACd,cAAc,QACd,cAAc,UAGlB,KAAI,QAAQ,QAAQ,cAAc;YAElC,EAAE,SAAS,cAAc,gBAAgB,cAAc,WAEvD,SAAQ,cAAc;YACb,EAAE,QAAQ,cAAc,eACjC,KAAI,QAAS,QAAQ,CAAC,cAAc,WAAY,cAAc;YAE9D,EAAE,SAAS,cAAc,QAAQ,cAAc,aAC/C,YAAY,MAAM,IAAI,EACtB;AACA,QAAI,QAAQ,SAAS,cAAc,WAAW,cAAc;AAC5D,aAAS,cAAc;SAEvB,SAAQ,cAAc;AAGxB,OAAI,QAAQ,cAAc,SACxB,QAAO,IAAI;AAGb,OAAI,QAAQ,cAAc,SAAS;IACjC,MAAM,UAAU,IAAI;AACpB,QAAI,YAAY,QAAW;KACzB,MAAM,WAAW,OAAO,SAAS;AACjC,SAAI,YAAY,QAAW;AACzB,cAAQ;OAAE,OAAO;OAAM,MAAM;OAAO;AACpC,aAAO;;AAET;;;AAIJ,QAAK,OAAO,UAAW,QAAW;AAChC,WAAO,KAAK;AACZ;;AAGF,UAAO,UAAU,QAAW;AAC1B,WAAO,MAAM;AACb,YAAQ,MAAM;AACd,QAAI,SAAS,QAAW;AACtB,YAAO,KAAK;AACZ,cAAS;;;AAIb;WACO;;CAGX,SAAS,WAAW,MAAY,KAA4B;EAC1D,IAAI;EACJ,IAAI,aAAa;EACjB,IAAI,QAAQ;AAEZ,MAAK,IAAG;GACN,MAAM,MAAM,KAAK;GACjB,MAAM,QAAQ,IAAI;AAElB,OAAI,IAAI,QAAQ,cAAc,MAC5B,SAAQ;aAEP,SAAS,cAAc,UAAU,cAAc,aAC/C,cAAc,UAAU,cAAc,QAEvC;QAAI,OAAO,IAAI,EAAE;KACf,MAAM,OAAO,IAAI;AACjB,SAAI,KAAK,YAAY,OACnB,kBAAiB,KAAK;AAExB,aAAQ;;eAGT,SAAS,cAAc,UAAU,cAAc,eAC/C,cAAc,UAAU,cAAc,UACvC;AACA,QAAI,KAAK,YAAY,UAAa,KAAK,YAAY,OACjD,SAAQ;KAAE,OAAO;KAAM,MAAM;KAAO;AAEtC,WAAO,IAAI;AACX,UAAM;AACN,MAAE;AACF;;AAGF,OAAI,CAAC,OAAO;IACV,MAAM,UAAU,KAAK;AACrB,QAAI,YAAY,QAAW;AACzB,YAAO;AACP;;;AAIJ,UAAO,cAAc;IACnB,MAAM,WAAW,IAAI;IACrB,MAAM,kBAAkB,SAAS,YAAY;AAC7C,QAAI,iBAAiB;AACnB,YAAO,MAAO;AACd,aAAQ,MAAO;UAEf,QAAO;AAET,QAAI,OAAO;AACT,SAAI,OAAO,IAAI,EAAE;AACf,UAAI,gBACF,kBAAiB,SAAS;AAE5B,YAAM,KAAK;AACX;;AAEF,aAAQ;UAER,KAAI,SAAS,CAAC,cAAc;AAE9B,UAAM,KAAK;IACX,MAAM,UAAU,KAAK;AACrB,QAAI,YAAY,QAAW;AACzB,YAAO;AACP,cAAS;;;AAIb,UAAO;WACA;;CAGX,SAAS,iBAAiB,MAAkB;AAC1C,KAAG;GACD,MAAM,MAAM,KAAK;GACjB,MAAM,QAAQ,IAAI;AAClB,QACG,SAAS,cAAc,UAAU,cAAc,YAChD,cAAc,SACd;AACA,QAAI,QAAQ,QAAQ,cAAc;AAClC,SACG,SAAS,cAAc,WAAW,cAAc,oBACjD,cAAc,SAEd,QAAO,IAAI;;YAGP,OAAO,KAAK,aAAc;;CAGtC,SAAS,YAAY,WAAiB,KAA4B;EAChE,IAAI,OAAO,IAAI;AACf,SAAO,SAAS,QAAW;AACzB,OAAI,SAAS,UACX,QAAO;AAET,UAAO,KAAK;;AAEd,SAAO"}
{"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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"}

@@ -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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"}

@@ -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 +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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"}
{
"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,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 @@ }

@@ -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)

@@ -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