Comparing version 2.9.2 to 2.9.3
@@ -6,3 +6,3 @@ { | ||
"type": "commonjs", | ||
"version": "2.9.2", | ||
"version": "2.9.3", | ||
"main": "./index.js", | ||
@@ -9,0 +9,0 @@ "types": "./index.d.ts", |
@@ -118,2 +118,17 @@ System.register([], (function (exports) { | ||
}; | ||
const addDependency = (pending, atom, atomState, a, aState) => { | ||
var _a; | ||
if (a === atom) { | ||
throw new Error("[Bug] atom cannot depend on itself"); | ||
} | ||
atomState.d.set(a, aState.n); | ||
const continuablePromise = getPendingContinuablePromise(atomState); | ||
if (continuablePromise) { | ||
addPendingContinuablePromiseToDependency(atom, continuablePromise, aState); | ||
} | ||
(_a = aState.m) == null ? void 0 : _a.t.add(atom); | ||
if (pending) { | ||
addPendingDependent(pending, a, atom); | ||
} | ||
}; | ||
const createPending = () => [/* @__PURE__ */ new Map(), /* @__PURE__ */ new Map(), /* @__PURE__ */ new Set()]; | ||
@@ -150,4 +165,3 @@ const addPendingAtom = (pending, atom, atomState) => { | ||
}; | ||
const createStore = exports("createStore", () => { | ||
const atomStateMap = /* @__PURE__ */ new WeakMap(); | ||
const buildStore = (getAtomState) => { | ||
let debugMountedAtoms; | ||
@@ -157,10 +171,2 @@ { | ||
} | ||
const getAtomState = (atom) => { | ||
let atomState = atomStateMap.get(atom); | ||
if (!atomState) { | ||
atomState = { d: /* @__PURE__ */ new Map(), p: /* @__PURE__ */ new Set(), n: 0 }; | ||
atomStateMap.set(atom, atomState); | ||
} | ||
return atomState; | ||
}; | ||
const setAtomStateValueOrPromise = (atom, atomState, valueOrPromise, abortPromise = () => { | ||
@@ -186,7 +192,6 @@ }, completePromise = () => { | ||
for (const a of atomState.d.keys()) { | ||
const aState = getAtomState(a); | ||
addPendingContinuablePromiseToDependency( | ||
atom, | ||
continuablePromise, | ||
aState | ||
getAtomState(a, atomState) | ||
); | ||
@@ -212,20 +217,3 @@ } | ||
}; | ||
const addDependency = (pending, atom, a, aState) => { | ||
var _a; | ||
if (a === atom) { | ||
throw new Error("[Bug] atom cannot depend on itself"); | ||
} | ||
const atomState = getAtomState(atom); | ||
atomState.d.set(a, aState.n); | ||
const continuablePromise = getPendingContinuablePromise(atomState); | ||
if (continuablePromise) { | ||
addPendingContinuablePromiseToDependency(atom, continuablePromise, aState); | ||
} | ||
(_a = aState.m) == null ? void 0 : _a.t.add(atom); | ||
if (pending) { | ||
addPendingDependent(pending, a, atom); | ||
} | ||
}; | ||
const readAtomState = (pending, atom, force) => { | ||
const atomState = getAtomState(atom); | ||
const readAtomState = (pending, atom, atomState, force) => { | ||
if (!(force == null ? void 0 : force(atom)) && isAtomStateInitialized(atomState)) { | ||
@@ -239,3 +227,3 @@ if (atomState.m) { | ||
// check if the atom epoch number is unchanged | ||
readAtomState(pending, a, force).n === n | ||
readAtomState(pending, a, getAtomState(a, atomState), force).n === n | ||
) | ||
@@ -250,3 +238,3 @@ )) { | ||
if (isSelfAtom(atom, a)) { | ||
const aState2 = getAtomState(a); | ||
const aState2 = getAtomState(a, atomState); | ||
if (!isAtomStateInitialized(aState2)) { | ||
@@ -261,8 +249,13 @@ if (hasInitialValue(a)) { | ||
} | ||
const aState = readAtomState(pending, a, force); | ||
const aState = readAtomState( | ||
pending, | ||
a, | ||
getAtomState(a, atomState), | ||
force | ||
); | ||
if (isSync) { | ||
addDependency(pending, atom, a, aState); | ||
addDependency(pending, atom, atomState, a, aState); | ||
} else { | ||
const pending2 = createPending(); | ||
addDependency(pending2, atom, a, aState); | ||
addDependency(pending2, atom, atomState, a, aState); | ||
mountDependencies(pending2, atom, atomState); | ||
@@ -324,37 +317,40 @@ flushPending(pending2); | ||
}; | ||
const readAtom = (atom) => returnAtomValue(readAtomState(void 0, atom)); | ||
const recomputeDependents = (pending, atom) => { | ||
const getDependents = (a) => { | ||
var _a, _b; | ||
const aState = getAtomState(a); | ||
const dependents = new Set((_a = aState.m) == null ? void 0 : _a.t); | ||
for (const atomWithPendingContinuablePromise of aState.p) { | ||
dependents.add(atomWithPendingContinuablePromise); | ||
} | ||
(_b = getPendingDependents(pending, a)) == null ? void 0 : _b.forEach((dependent) => { | ||
dependents.add(dependent); | ||
}); | ||
return dependents; | ||
}; | ||
const readAtom = (atom) => returnAtomValue(readAtomState(void 0, atom, getAtomState(atom))); | ||
const getDependents = (pending, atom, atomState) => { | ||
var _a, _b; | ||
const dependents = /* @__PURE__ */ new Map(); | ||
for (const a of ((_a = atomState.m) == null ? void 0 : _a.t) || []) { | ||
dependents.set(a, getAtomState(a, atomState)); | ||
} | ||
for (const atomWithPendingContinuablePromise of atomState.p) { | ||
dependents.set( | ||
atomWithPendingContinuablePromise, | ||
getAtomState(atomWithPendingContinuablePromise, atomState) | ||
); | ||
} | ||
(_b = getPendingDependents(pending, atom)) == null ? void 0 : _b.forEach((dependent) => { | ||
dependents.set(dependent, getAtomState(dependent, atomState)); | ||
}); | ||
return dependents; | ||
}; | ||
const recomputeDependents = (pending, atom, atomState) => { | ||
const topsortedAtoms = []; | ||
const markedAtoms = /* @__PURE__ */ new Set(); | ||
const visit = (n) => { | ||
if (markedAtoms.has(n)) { | ||
const visit = (a, aState) => { | ||
if (markedAtoms.has(a)) { | ||
return; | ||
} | ||
markedAtoms.add(n); | ||
for (const m of getDependents(n)) { | ||
if (n !== m) { | ||
visit(m); | ||
markedAtoms.add(a); | ||
for (const [d, s] of getDependents(pending, a, aState)) { | ||
if (a !== d) { | ||
visit(d, s); | ||
} | ||
} | ||
topsortedAtoms.push(n); | ||
topsortedAtoms.push([a, aState, aState.n]); | ||
}; | ||
visit(atom); | ||
visit(atom, atomState); | ||
const changedAtoms = /* @__PURE__ */ new Set([atom]); | ||
const isMarked = (a) => markedAtoms.has(a); | ||
for (let i = topsortedAtoms.length - 1; i >= 0; --i) { | ||
const a = topsortedAtoms[i]; | ||
const aState = getAtomState(a); | ||
const prevEpochNumber = aState.n; | ||
const [a, aState, prevEpochNumber] = topsortedAtoms[i]; | ||
let hasChangedDeps = false; | ||
@@ -368,3 +364,3 @@ for (const dep of aState.d.keys()) { | ||
if (hasChangedDeps) { | ||
readAtomState(pending, a, isMarked); | ||
readAtomState(pending, a, aState, isMarked); | ||
mountDependencies(pending, a, aState); | ||
@@ -379,5 +375,6 @@ if (prevEpochNumber !== aState.n) { | ||
}; | ||
const writeAtomState = (pending, atom, ...args) => { | ||
const getter = (a) => returnAtomValue(readAtomState(pending, a)); | ||
const writeAtomState = (pending, atom, atomState, ...args) => { | ||
const getter = (a) => returnAtomValue(readAtomState(pending, a, getAtomState(a, atomState))); | ||
const setter = (a, ...args2) => { | ||
const aState = getAtomState(a, atomState); | ||
let r; | ||
@@ -388,3 +385,2 @@ if (isSelfAtom(atom, a)) { | ||
} | ||
const aState = getAtomState(a); | ||
const hasPrevValue = "v" in aState; | ||
@@ -397,6 +393,6 @@ const prevValue = aState.v; | ||
addPendingAtom(pending, a, aState); | ||
recomputeDependents(pending, a); | ||
recomputeDependents(pending, a, aState); | ||
} | ||
} else { | ||
r = writeAtomState(pending, a, ...args2); | ||
r = writeAtomState(pending, a, aState, ...args2); | ||
} | ||
@@ -411,3 +407,3 @@ flushPending(pending); | ||
const pending = createPending(); | ||
const result = writeAtomState(pending, atom, ...args); | ||
const result = writeAtomState(pending, atom, getAtomState(atom), ...args); | ||
flushPending(pending); | ||
@@ -420,3 +416,3 @@ return result; | ||
if (!atomState.m.d.has(a)) { | ||
const aMounted = mountAtom(pending, a); | ||
const aMounted = mountAtom(pending, a, getAtomState(a, atomState)); | ||
aMounted.t.add(atom); | ||
@@ -429,3 +425,3 @@ atomState.m.d.add(a); | ||
atomState.m.d.delete(a); | ||
const aMounted = unmountAtom(pending, a); | ||
const aMounted = unmountAtom(pending, a, getAtomState(a, atomState)); | ||
aMounted == null ? void 0 : aMounted.t.delete(atom); | ||
@@ -436,8 +432,7 @@ } | ||
}; | ||
const mountAtom = (pending, atom) => { | ||
const atomState = getAtomState(atom); | ||
const mountAtom = (pending, atom, atomState) => { | ||
if (!atomState.m) { | ||
readAtomState(pending, atom); | ||
readAtomState(pending, atom, atomState); | ||
for (const a of atomState.d.keys()) { | ||
const aMounted = mountAtom(pending, a); | ||
const aMounted = mountAtom(pending, a, getAtomState(a, atomState)); | ||
aMounted.t.add(atom); | ||
@@ -458,3 +453,3 @@ } | ||
const onUnmount = onMount( | ||
(...args) => writeAtomState(pending, atom, ...args) | ||
(...args) => writeAtomState(pending, atom, atomState, ...args) | ||
); | ||
@@ -469,8 +464,9 @@ if (onUnmount) { | ||
}; | ||
const unmountAtom = (pending, atom) => { | ||
const atomState = getAtomState(atom); | ||
if (atomState.m && !atomState.m.l.size && !Array.from(atomState.m.t).some((a) => { | ||
var _a; | ||
return (_a = getAtomState(a).m) == null ? void 0 : _a.d.has(atom); | ||
})) { | ||
const unmountAtom = (pending, atom, atomState) => { | ||
if (atomState.m && !atomState.m.l.size && !Array.from(atomState.m.t).some( | ||
(a) => { | ||
var _a; | ||
return (_a = getAtomState(a, atomState).m) == null ? void 0 : _a.d.has(atom); | ||
} | ||
)) { | ||
const onUnmount = atomState.m.u; | ||
@@ -485,3 +481,3 @@ if (onUnmount) { | ||
for (const a of atomState.d.keys()) { | ||
const aMounted = unmountAtom(pending, a); | ||
const aMounted = unmountAtom(pending, a, getAtomState(a, atomState)); | ||
aMounted == null ? void 0 : aMounted.t.delete(atom); | ||
@@ -500,3 +496,4 @@ } | ||
const pending = createPending(); | ||
const mounted = mountAtom(pending, atom); | ||
const atomState = getAtomState(atom); | ||
const mounted = mountAtom(pending, atom, atomState); | ||
flushPending(pending); | ||
@@ -508,10 +505,12 @@ const listeners = mounted.l; | ||
const pending2 = createPending(); | ||
unmountAtom(pending2, atom); | ||
unmountAtom(pending2, atom, atomState); | ||
flushPending(pending2); | ||
}; | ||
}; | ||
const unstable_derive = (fn) => buildStore(...fn(getAtomState)); | ||
const store = { | ||
get: readAtom, | ||
set: writeAtom, | ||
sub: subscribeAtom | ||
sub: subscribeAtom, | ||
unstable_derive | ||
}; | ||
@@ -521,3 +520,11 @@ { | ||
// store dev methods (these are tentative and subject to change without notice) | ||
dev4_get_internal_weak_map: () => atomStateMap, | ||
dev4_get_internal_weak_map: () => ({ | ||
get: (atom) => { | ||
const atomState = getAtomState(atom); | ||
if (atomState.n === 0) { | ||
return void 0; | ||
} | ||
return atomState; | ||
} | ||
}), | ||
dev4_get_mounted_atoms: () => debugMountedAtoms, | ||
@@ -535,3 +542,3 @@ dev4_restore_atoms: (values) => { | ||
addPendingAtom(pending, atom, atomState); | ||
recomputeDependents(pending, atom); | ||
recomputeDependents(pending, atom, atomState); | ||
} | ||
@@ -546,2 +553,14 @@ } | ||
return store; | ||
}; | ||
const createStore = exports("createStore", () => { | ||
const atomStateMap = /* @__PURE__ */ new WeakMap(); | ||
const getAtomState = (atom) => { | ||
let atomState = atomStateMap.get(atom); | ||
if (!atomState) { | ||
atomState = { d: /* @__PURE__ */ new Map(), p: /* @__PURE__ */ new Set(), n: 0 }; | ||
atomStateMap.set(atom, atomState); | ||
} | ||
return atomState; | ||
}; | ||
return buildStore(getAtomState); | ||
}); | ||
@@ -548,0 +567,0 @@ let defaultStore; |
@@ -1,1 +0,1 @@ | ||
System.register([],function(W){"use strict";return{execute:function(){W("atom",L);let K=0;function L(t,s){const f=`atom${++K}`,m={toString(){return f}};return typeof t=="function"?m.read=t:(m.init=t,m.read=N,m.write=R),s&&(m.write=s),m}function N(t){return t(this)}function R(t,s,f){return s(this,typeof f=="function"?f(t(this)):f)}const q=(t,s)=>t.unstable_is?t.unstable_is(s):s===t,B=t=>"init"in t,F=t=>!!t.write,M=Symbol(""),_="pending",T="fulfilled",U="rejected",$=t=>typeof t=="object"&&t!==null&&M in t,D=new WeakMap,x=(t,s,f)=>{if(!D.has(t)){let m;const w=new Promise((j,V)=>{let y=t;const z=h=>p=>{y===h&&(w.status=T,w.value=p,j(p),f())},g=h=>p=>{y===h&&(w.status=U,w.reason=p,V(p),f())};t.then(z(t),g(t)),m=(h,p)=>{h&&(D.set(h,w),y=h,h.then(z(h),g(h)),s(),s=p)}});w.status=_,w[M]=m,D.set(t,w)}return D.get(t)},Q=t=>typeof(t==null?void 0:t.then)=="function",G=t=>"v"in t||"e"in t,O=t=>{if("e"in t)throw t.e;return t.v},P=t=>{const s=t.v;return $(s)&&s.status===_?s:null},H=(t,s,f)=>{f.p.has(t)||(f.p.add(t),s.then(()=>{f.p.delete(t)},()=>{f.p.delete(t)}))},E=()=>[new Map,new Map,new Set],I=(t,s,f)=>{t[0].has(s)||t[0].set(s,new Set),t[1].set(s,f)},X=(t,s,f)=>{const m=t[0].get(s);m&&m.add(f)},Y=(t,s)=>t[0].get(s),J=(t,s)=>{t[2].add(s)},b=t=>{for(;t[1].size||t[2].size;){t[0].clear();const s=new Set(t[1].values());t[1].clear();const f=new Set(t[2]);t[2].clear(),s.forEach(m=>{var w;return(w=m.m)==null?void 0:w.l.forEach(j=>j())}),f.forEach(m=>m())}},Z=W("createStore",()=>{const t=new WeakMap,s=r=>{let e=t.get(r);return e||(e={d:new Map,p:new Set,n:0},t.set(r,e)),e},f=(r,e,n,o=()=>{},c=()=>{})=>{const l="v"in e,u=e.v,v=P(e);if(Q(n))if(v)v!==n&&(v[M](n,o),++e.n);else{const a=x(n,o,c);if(a.status===_)for(const i of e.d.keys()){const d=s(i);H(r,a,d)}e.v=a,delete e.e}else v&&v[M](Promise.resolve(n),o),e.v=n,delete e.e;(!l||!Object.is(u,e.v))&&++e.n},m=(r,e,n,o)=>{var c;const l=s(e);l.d.set(n,o.n);const u=P(l);u&&H(e,u,o),(c=o.m)==null||c.t.add(e),r&&X(r,n,e)},w=(r,e,n)=>{const o=s(e);if(!(n!=null&&n(e))&&G(o)&&(o.m||Array.from(o.d).every(([i,d])=>w(r,i,n).n===d)))return o;o.d.clear();let c=!0;const l=i=>{if(q(e,i)){const S=s(i);if(!G(S))if(B(i))f(i,S,i.init);else throw new Error("no atom init");return O(S)}const d=w(r,i,n);if(c)m(r,e,i,d);else{const S=E();m(S,e,i,d),g(S,e,o),b(S)}return O(d)};let u,v;const a={get signal(){return u||(u=new AbortController),u.signal},get setSelf(){return!v&&F(e)&&(v=(...i)=>{if(!c)return z(e,...i)}),v}};try{const i=e.read(l,a);return f(e,o,i,()=>u==null?void 0:u.abort(),()=>{if(o.m){const d=E();g(d,e,o),b(d)}}),o}catch(i){return delete o.v,o.e=i,++o.n,o}finally{c=!1}},j=r=>O(w(void 0,r)),V=(r,e)=>{const n=a=>{var i,d;const S=s(a),k=new Set((i=S.m)==null?void 0:i.t);for(const A of S.p)k.add(A);return(d=Y(r,a))==null||d.forEach(A=>{k.add(A)}),k},o=[],c=new Set,l=a=>{if(!c.has(a)){c.add(a);for(const i of n(a))a!==i&&l(i);o.push(a)}};l(e);const u=new Set([e]),v=a=>c.has(a);for(let a=o.length-1;a>=0;--a){const i=o[a],d=s(i),S=d.n;let k=!1;for(const A of d.d.keys())if(A!==i&&u.has(A)){k=!0;break}k&&(w(r,i,v),g(r,i,d),S!==d.n&&(I(r,i,d),u.add(i))),c.delete(i)}},y=(r,e,...n)=>{const o=l=>O(w(r,l)),c=(l,...u)=>{let v;if(q(e,l)){if(!B(l))throw new Error("atom not writable");const a=s(l),i="v"in a,d=a.v,S=u[0];f(l,a,S),g(r,l,a),(!i||!Object.is(d,a.v))&&(I(r,l,a),V(r,l))}else v=y(r,l,...u);return b(r),v};return e.write(o,c,...n)},z=(r,...e)=>{const n=E(),o=y(n,r,...e);return b(n),o},g=(r,e,n)=>{if(n.m&&!P(n)){for(const o of n.d.keys())n.m.d.has(o)||(h(r,o).t.add(e),n.m.d.add(o));for(const o of n.m.d||[])if(!n.d.has(o)){n.m.d.delete(o);const c=p(r,o);c==null||c.t.delete(e)}}},h=(r,e)=>{const n=s(e);if(!n.m){w(r,e);for(const o of n.d.keys())h(r,o).t.add(e);if(n.m={l:new Set,d:new Set(n.d.keys()),t:new Set},F(e)&&e.onMount){const o=n.m,{onMount:c}=e;J(r,()=>{const l=c((...u)=>y(r,e,...u));l&&(o.u=l)})}}return n.m},p=(r,e)=>{const n=s(e);if(n.m&&!n.m.l.size&&!Array.from(n.m.t).some(o=>{var c;return(c=s(o).m)==null?void 0:c.d.has(e)})){const o=n.m.u;o&&J(r,o),delete n.m;for(const l of n.d.keys()){const u=p(r,l);u==null||u.t.delete(e)}const c=P(n);c&&c[M](void 0,()=>{});return}return n.m};return{get:j,set:z,sub:(r,e)=>{const n=E(),o=h(n,r);b(n);const c=o.l;return c.add(e),()=>{c.delete(e);const l=E();p(l,r),b(l)}}}});let C;const tt=W("getDefaultStore",()=>(C||(C=Z()),C))}}}); | ||
System.register([],function(D){"use strict";return{execute:function(){D("atom",N);let L=0;function N(t,s){const l=`atom${++L}`,d={toString(){return l}};return typeof t=="function"?d.read=t:(d.init=t,d.read=Q,d.write=R),s&&(d.write=s),d}function Q(t){return t(this)}function R(t,s,l){return s(this,typeof l=="function"?l(t(this)):l)}const C=(t,s)=>t.unstable_is?t.unstable_is(s):s===t,T=t=>"init"in t,q=t=>!!t.write,E=Symbol(""),O="pending",U="fulfilled",$="rejected",x=t=>typeof t=="object"&&t!==null&&E in t,V=new WeakMap,X=(t,s,l)=>{if(!V.has(t)){let d;const w=new Promise((y,g)=>{let k=t;const b=h=>o=>{k===h&&(w.status=U,w.value=o,y(o),l())},M=h=>o=>{k===h&&(w.status=$,w.reason=o,g(o),l())};t.then(b(t),M(t)),d=(h,o)=>{h&&(V.set(h,w),k=h,h.then(b(h),M(h)),s(),s=o)}});w.status=O,w[E]=d,V.set(t,w)}return V.get(t)},Y=t=>typeof(t==null?void 0:t.then)=="function",B=t=>"v"in t||"e"in t,_=t=>{if("e"in t)throw t.e;return t.v},z=t=>{const s=t.v;return x(s)&&s.status===O?s:null},F=(t,s,l)=>{l.p.has(t)||(l.p.add(t),s.then(()=>{l.p.delete(t)},()=>{l.p.delete(t)}))},G=(t,s,l,d,w)=>{var y;l.d.set(d,w.n);const g=z(l);g&&F(s,g,w),(y=w.m)==null||y.t.add(s),t&&Z(t,d,s)},j=()=>[new Map,new Map,new Set],H=(t,s,l)=>{t[0].has(s)||t[0].set(s,new Set),t[1].set(s,l)},Z=(t,s,l)=>{const d=t[0].get(s);d&&d.add(l)},A=(t,s)=>t[0].get(s),I=(t,s)=>{t[2].add(s)},p=t=>{for(;t[1].size||t[2].size;){t[0].clear();const s=new Set(t[1].values());t[1].clear();const l=new Set(t[2]);t[2].clear(),s.forEach(d=>{var w;return(w=d.m)==null?void 0:w.l.forEach(y=>y())}),l.forEach(d=>d())}},J=t=>{const s=(o,r,e,n=()=>{},u=()=>{})=>{const f="v"in r,i=r.v,v=z(r);if(Y(e))if(v)v!==e&&(v[E](e,n),++r.n);else{const a=X(e,n,u);if(a.status===O)for(const c of r.d.keys())F(o,a,t(c,r));r.v=a,delete r.e}else v&&v[E](Promise.resolve(e),n),r.v=e,delete r.e;(!f||!Object.is(i,r.v))&&++r.n},l=(o,r,e,n)=>{if(!(n!=null&&n(r))&&B(e)&&(e.m||Array.from(e.d).every(([c,m])=>l(o,c,t(c,e),n).n===m)))return e;e.d.clear();let u=!0;const f=c=>{if(C(r,c)){const S=t(c,e);if(!B(S))if(T(c))s(c,S,c.init);else throw new Error("no atom init");return _(S)}const m=l(o,c,t(c,e),n);if(u)G(o,r,e,c,m);else{const S=j();G(S,r,e,c,m),b(S,r,e),p(S)}return _(m)};let i,v;const a={get signal(){return i||(i=new AbortController),i.signal},get setSelf(){return!v&&q(r)&&(v=(...c)=>{if(!u)return k(r,...c)}),v}};try{const c=r.read(f,a);return s(r,e,c,()=>i==null?void 0:i.abort(),()=>{if(e.m){const m=j();b(m,r,e),p(m)}}),e}catch(c){return delete e.v,e.e=c,++e.n,e}finally{u=!1}},d=o=>_(l(void 0,o,t(o))),w=(o,r,e)=>{var n,u;const f=new Map;for(const i of((n=e.m)==null?void 0:n.t)||[])f.set(i,t(i,e));for(const i of e.p)f.set(i,t(i,e));return(u=A(o,r))==null||u.forEach(i=>{f.set(i,t(i,e))}),f},y=(o,r,e)=>{const n=[],u=new Set,f=(a,c)=>{if(!u.has(a)){u.add(a);for(const[m,S]of w(o,a,c))a!==m&&f(m,S);n.push([a,c,c.n])}};f(r,e);const i=new Set([r]),v=a=>u.has(a);for(let a=n.length-1;a>=0;--a){const[c,m,S]=n[a];let P=!1;for(const K of m.d.keys())if(K!==c&&i.has(K)){P=!0;break}P&&(l(o,c,m,v),b(o,c,m),S!==m.n&&(H(o,c,m),i.add(c))),u.delete(c)}},g=(o,r,e,...n)=>{const u=i=>_(l(o,i,t(i,e))),f=(i,...v)=>{const a=t(i,e);let c;if(C(r,i)){if(!T(i))throw new Error("atom not writable");const m="v"in a,S=a.v,P=v[0];s(i,a,P),b(o,i,a),(!m||!Object.is(S,a.v))&&(H(o,i,a),y(o,i,a))}else c=g(o,i,a,...v);return p(o),c};return r.write(u,f,...n)},k=(o,...r)=>{const e=j(),n=g(e,o,t(o),...r);return p(e),n},b=(o,r,e)=>{if(e.m&&!z(e)){for(const n of e.d.keys())e.m.d.has(n)||(M(o,n,t(n,e)).t.add(r),e.m.d.add(n));for(const n of e.m.d||[])if(!e.d.has(n)){e.m.d.delete(n);const u=h(o,n,t(n,e));u==null||u.t.delete(r)}}},M=(o,r,e)=>{if(!e.m){l(o,r,e);for(const n of e.d.keys())M(o,n,t(n,e)).t.add(r);if(e.m={l:new Set,d:new Set(e.d.keys()),t:new Set},q(r)&&r.onMount){const n=e.m,{onMount:u}=r;I(o,()=>{const f=u((...i)=>g(o,r,e,...i));f&&(n.u=f)})}}return e.m},h=(o,r,e)=>{if(e.m&&!e.m.l.size&&!Array.from(e.m.t).some(n=>{var u;return(u=t(n,e).m)==null?void 0:u.d.has(r)})){const n=e.m.u;n&&I(o,n),delete e.m;for(const f of e.d.keys()){const i=h(o,f,t(f,e));i==null||i.t.delete(r)}const u=z(e);u&&u[E](void 0,()=>{});return}return e.m};return{get:d,set:k,sub:(o,r)=>{const e=j(),n=t(o),u=M(e,o,n);p(e);const f=u.l;return f.add(r),()=>{f.delete(r);const i=j();h(i,o,n),p(i)}},unstable_derive:o=>J(...o(t))}},tt=D("createStore",()=>{const t=new WeakMap;return J(s=>{let l=t.get(s);return l||(l={d:new Map,p:new Set,n:0},t.set(s,l)),l})});let W;const et=D("getDefaultStore",()=>(W||(W=tt()),W))}}}); |
@@ -48,4 +48,10 @@ import type { Atom, WritableAtom } from './atom'; | ||
}; | ||
type GetAtomState = <Value>(atom: Atom<Value>, originAtomState?: AtomState) => AtomState<Value>; | ||
type StoreArgs = readonly [ | ||
/*getAtomState*/ GetAtomState | ||
]; | ||
type DevStoreRev4 = { | ||
dev4_get_internal_weak_map: () => WeakMap<AnyAtom, AtomState>; | ||
dev4_get_internal_weak_map: () => { | ||
get: (atom: AnyAtom) => AtomState | undefined; | ||
}; | ||
dev4_get_mounted_atoms: () => Set<AnyAtom>; | ||
@@ -61,2 +67,3 @@ dev4_restore_atoms: (values: Iterable<readonly [ | ||
sub: (atom: AnyAtom, listener: () => void) => () => void; | ||
unstable_derive: (fn: (...args: StoreArgs) => StoreArgs) => Store; | ||
}; | ||
@@ -63,0 +70,0 @@ type Store = PrdStore | (PrdStore & DevStoreRev4); |
@@ -48,4 +48,10 @@ import type { Atom, WritableAtom } from './atom'; | ||
}; | ||
type GetAtomState = <Value>(atom: Atom<Value>, originAtomState?: AtomState) => AtomState<Value>; | ||
type StoreArgs = readonly [ | ||
/*getAtomState*/ GetAtomState | ||
]; | ||
type DevStoreRev4 = { | ||
dev4_get_internal_weak_map: () => WeakMap<AnyAtom, AtomState>; | ||
dev4_get_internal_weak_map: () => { | ||
get: (atom: AnyAtom) => AtomState | undefined; | ||
}; | ||
dev4_get_mounted_atoms: () => Set<AnyAtom>; | ||
@@ -61,2 +67,3 @@ dev4_restore_atoms: (values: Iterable<readonly [ | ||
sub: (atom: AnyAtom, listener: () => void) => () => void; | ||
unstable_derive: (fn: (...args: StoreArgs) => StoreArgs) => Store; | ||
}; | ||
@@ -63,0 +70,0 @@ type Store = PrdStore | (PrdStore & DevStoreRev4); |
@@ -155,2 +155,17 @@ (function (global, factory) { | ||
}; | ||
var addDependency = function addDependency(pending, atom, atomState, a, aState) { | ||
var _aState$m; | ||
if (a === atom) { | ||
throw new Error('[Bug] atom cannot depend on itself'); | ||
} | ||
atomState.d.set(a, aState.n); | ||
var continuablePromise = getPendingContinuablePromise(atomState); | ||
if (continuablePromise) { | ||
addPendingContinuablePromiseToDependency(atom, continuablePromise, aState); | ||
} | ||
(_aState$m = aState.m) == null || _aState$m.t.add(atom); | ||
if (pending) { | ||
addPendingDependent(pending, a, atom); | ||
} | ||
}; | ||
var createPending = function createPending() { | ||
@@ -195,4 +210,3 @@ return [new Map(), new Map(), new Set()]; | ||
}; | ||
var createStore = function createStore() { | ||
var atomStateMap = new WeakMap(); | ||
var _buildStore = function buildStore(getAtomState) { | ||
var debugMountedAtoms; | ||
@@ -202,14 +216,2 @@ { | ||
} | ||
var getAtomState = function getAtomState(atom) { | ||
var atomState = atomStateMap.get(atom); | ||
if (!atomState) { | ||
atomState = { | ||
d: new Map(), | ||
p: new Set(), | ||
n: 0 | ||
}; | ||
atomStateMap.set(atom, atomState); | ||
} | ||
return atomState; | ||
}; | ||
var setAtomStateValueOrPromise = function setAtomStateValueOrPromise(atom, atomState, valueOrPromise, abortPromise, completePromise) { | ||
@@ -236,4 +238,3 @@ if (abortPromise === void 0) { | ||
var a = _step.value; | ||
var aState = getAtomState(a); | ||
addPendingContinuablePromiseToDependency(atom, continuablePromise, aState); | ||
addPendingContinuablePromiseToDependency(atom, continuablePromise, getAtomState(a, atomState)); | ||
} | ||
@@ -255,20 +256,3 @@ } | ||
}; | ||
var addDependency = function addDependency(pending, atom, a, aState) { | ||
var _aState$m; | ||
if (a === atom) { | ||
throw new Error('[Bug] atom cannot depend on itself'); | ||
} | ||
var atomState = getAtomState(atom); | ||
atomState.d.set(a, aState.n); | ||
var continuablePromise = getPendingContinuablePromise(atomState); | ||
if (continuablePromise) { | ||
addPendingContinuablePromiseToDependency(atom, continuablePromise, aState); | ||
} | ||
(_aState$m = aState.m) == null || _aState$m.t.add(atom); | ||
if (pending) { | ||
addPendingDependent(pending, a, atom); | ||
} | ||
}; | ||
var _readAtomState = function readAtomState(pending, atom, force) { | ||
var atomState = getAtomState(atom); | ||
var _readAtomState = function readAtomState(pending, atom, atomState, force) { | ||
if (!(force != null && force(atom)) && isAtomStateInitialized(atomState)) { | ||
@@ -281,3 +265,3 @@ if (atomState.m) { | ||
n = _ref[1]; | ||
return _readAtomState(pending, a, force).n === n; | ||
return _readAtomState(pending, a, getAtomState(a, atomState), force).n === n; | ||
})) { | ||
@@ -291,3 +275,3 @@ return atomState; | ||
if (isSelfAtom(atom, a)) { | ||
var _aState = getAtomState(a); | ||
var _aState = getAtomState(a, atomState); | ||
if (!isAtomStateInitialized(_aState)) { | ||
@@ -302,8 +286,8 @@ if (hasInitialValue(a)) { | ||
} | ||
var aState = _readAtomState(pending, a, force); | ||
var aState = _readAtomState(pending, a, getAtomState(a, atomState), force); | ||
if (isSync) { | ||
addDependency(pending, atom, a, aState); | ||
addDependency(pending, atom, atomState, a, aState); | ||
} else { | ||
var _pending = createPending(); | ||
addDependency(_pending, atom, a, aState); | ||
addDependency(_pending, atom, atomState, a, aState); | ||
mountDependencies(_pending, atom, atomState); | ||
@@ -366,34 +350,40 @@ flushPending(_pending); | ||
var readAtom = function readAtom(atom) { | ||
return returnAtomValue(_readAtomState(undefined, atom)); | ||
return returnAtomValue(_readAtomState(undefined, atom, getAtomState(atom))); | ||
}; | ||
var recomputeDependents = function recomputeDependents(pending, atom) { | ||
var getDependents = function getDependents(a) { | ||
var _aState$m2, _getPendingDependents; | ||
var aState = getAtomState(a); | ||
var dependents = new Set((_aState$m2 = aState.m) == null ? void 0 : _aState$m2.t); | ||
for (var _iterator2 = _createForOfIteratorHelperLoose(aState.p), _step2; !(_step2 = _iterator2()).done;) { | ||
var atomWithPendingContinuablePromise = _step2.value; | ||
dependents.add(atomWithPendingContinuablePromise); | ||
} | ||
(_getPendingDependents = getPendingDependents(pending, a)) == null || _getPendingDependents.forEach(function (dependent) { | ||
dependents.add(dependent); | ||
}); | ||
return dependents; | ||
}; | ||
var getDependents = function getDependents(pending, atom, atomState) { | ||
var _getPendingDependents; | ||
var dependents = new Map(); | ||
for (var _iterator2 = _createForOfIteratorHelperLoose(((_atomState$m2 = atomState.m) == null ? void 0 : _atomState$m2.t) || []), _step2; !(_step2 = _iterator2()).done;) { | ||
var _atomState$m2; | ||
var a = _step2.value; | ||
dependents.set(a, getAtomState(a, atomState)); | ||
} | ||
for (var _iterator3 = _createForOfIteratorHelperLoose(atomState.p), _step3; !(_step3 = _iterator3()).done;) { | ||
var atomWithPendingContinuablePromise = _step3.value; | ||
dependents.set(atomWithPendingContinuablePromise, getAtomState(atomWithPendingContinuablePromise, atomState)); | ||
} | ||
(_getPendingDependents = getPendingDependents(pending, atom)) == null || _getPendingDependents.forEach(function (dependent) { | ||
dependents.set(dependent, getAtomState(dependent, atomState)); | ||
}); | ||
return dependents; | ||
}; | ||
var recomputeDependents = function recomputeDependents(pending, atom, atomState) { | ||
var topsortedAtoms = []; | ||
var markedAtoms = new Set(); | ||
var _visit = function visit(n) { | ||
if (markedAtoms.has(n)) { | ||
var _visit = function visit(a, aState) { | ||
if (markedAtoms.has(a)) { | ||
return; | ||
} | ||
markedAtoms.add(n); | ||
for (var _iterator3 = _createForOfIteratorHelperLoose(getDependents(n)), _step3; !(_step3 = _iterator3()).done;) { | ||
var m = _step3.value; | ||
if (n !== m) { | ||
_visit(m); | ||
markedAtoms.add(a); | ||
for (var _iterator4 = _createForOfIteratorHelperLoose(getDependents(pending, a, aState)), _step4; !(_step4 = _iterator4()).done;) { | ||
var _step4$value = _step4.value, | ||
d = _step4$value[0], | ||
s = _step4$value[1]; | ||
if (a !== d) { | ||
_visit(d, s); | ||
} | ||
} | ||
topsortedAtoms.push(n); | ||
topsortedAtoms.push([a, aState, aState.n]); | ||
}; | ||
_visit(atom); | ||
_visit(atom, atomState); | ||
var changedAtoms = new Set([atom]); | ||
@@ -404,8 +394,9 @@ var isMarked = function isMarked(a) { | ||
for (var i = topsortedAtoms.length - 1; i >= 0; --i) { | ||
var a = topsortedAtoms[i]; | ||
var aState = getAtomState(a); | ||
var prevEpochNumber = aState.n; | ||
var _ref2 = topsortedAtoms[i], | ||
a = _ref2[0], | ||
aState = _ref2[1], | ||
prevEpochNumber = _ref2[2]; | ||
var hasChangedDeps = false; | ||
for (var _iterator4 = _createForOfIteratorHelperLoose(aState.d.keys()), _step4; !(_step4 = _iterator4()).done;) { | ||
var dep = _step4.value; | ||
for (var _iterator5 = _createForOfIteratorHelperLoose(aState.d.keys()), _step5; !(_step5 = _iterator5()).done;) { | ||
var dep = _step5.value; | ||
if (dep !== a && changedAtoms.has(dep)) { | ||
@@ -417,3 +408,3 @@ hasChangedDeps = true; | ||
if (hasChangedDeps) { | ||
_readAtomState(pending, a, isMarked); | ||
_readAtomState(pending, a, aState, isMarked); | ||
mountDependencies(pending, a, aState); | ||
@@ -428,7 +419,8 @@ if (prevEpochNumber !== aState.n) { | ||
}; | ||
var _writeAtomState = function writeAtomState(pending, atom) { | ||
var _writeAtomState = function writeAtomState(pending, atom, atomState) { | ||
var getter = function getter(a) { | ||
return returnAtomValue(_readAtomState(pending, a)); | ||
return returnAtomValue(_readAtomState(pending, a, getAtomState(a, atomState))); | ||
}; | ||
var setter = function setter(a) { | ||
var aState = getAtomState(a, atomState); | ||
var r; | ||
@@ -442,3 +434,2 @@ for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { | ||
} | ||
var aState = getAtomState(a); | ||
var hasPrevValue = 'v' in aState; | ||
@@ -451,6 +442,6 @@ var prevValue = aState.v; | ||
addPendingAtom(pending, a, aState); | ||
recomputeDependents(pending, a); | ||
recomputeDependents(pending, a, aState); | ||
} | ||
} else { | ||
r = _writeAtomState.apply(void 0, [pending, a].concat(args)); | ||
r = _writeAtomState.apply(void 0, [pending, a, aState].concat(args)); | ||
} | ||
@@ -460,4 +451,4 @@ flushPending(pending); | ||
}; | ||
for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { | ||
args[_key2 - 2] = arguments[_key2]; | ||
for (var _len2 = arguments.length, args = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) { | ||
args[_key2 - 3] = arguments[_key2]; | ||
} | ||
@@ -472,3 +463,3 @@ var result = atom.write.apply(atom, [getter, setter].concat(args)); | ||
} | ||
var result = _writeAtomState.apply(void 0, [pending, atom].concat(args)); | ||
var result = _writeAtomState.apply(void 0, [pending, atom, getAtomState(atom)].concat(args)); | ||
flushPending(pending); | ||
@@ -479,6 +470,6 @@ return result; | ||
if (atomState.m && !getPendingContinuablePromise(atomState)) { | ||
for (var _iterator5 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step5; !(_step5 = _iterator5()).done;) { | ||
var a = _step5.value; | ||
for (var _iterator6 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step6; !(_step6 = _iterator6()).done;) { | ||
var a = _step6.value; | ||
if (!atomState.m.d.has(a)) { | ||
var aMounted = _mountAtom(pending, a); | ||
var aMounted = _mountAtom(pending, a, getAtomState(a, atomState)); | ||
aMounted.t.add(atom); | ||
@@ -488,7 +479,7 @@ atomState.m.d.add(a); | ||
} | ||
for (var _iterator6 = _createForOfIteratorHelperLoose(atomState.m.d || []), _step6; !(_step6 = _iterator6()).done;) { | ||
var _a = _step6.value; | ||
for (var _iterator7 = _createForOfIteratorHelperLoose(atomState.m.d || []), _step7; !(_step7 = _iterator7()).done;) { | ||
var _a = _step7.value; | ||
if (!atomState.d.has(_a)) { | ||
atomState.m.d.delete(_a); | ||
var _aMounted = _unmountAtom(pending, _a); | ||
var _aMounted = _unmountAtom(pending, _a, getAtomState(_a, atomState)); | ||
_aMounted == null || _aMounted.t.delete(atom); | ||
@@ -499,9 +490,8 @@ } | ||
}; | ||
var _mountAtom = function mountAtom(pending, atom) { | ||
var atomState = getAtomState(atom); | ||
var _mountAtom = function mountAtom(pending, atom, atomState) { | ||
if (!atomState.m) { | ||
_readAtomState(pending, atom); | ||
for (var _iterator7 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step7; !(_step7 = _iterator7()).done;) { | ||
var a = _step7.value; | ||
var aMounted = _mountAtom(pending, a); | ||
_readAtomState(pending, atom, atomState); | ||
for (var _iterator8 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step8; !(_step8 = _iterator8()).done;) { | ||
var a = _step8.value; | ||
var aMounted = _mountAtom(pending, a, getAtomState(a, atomState)); | ||
aMounted.t.add(atom); | ||
@@ -525,3 +515,3 @@ } | ||
} | ||
return _writeAtomState.apply(void 0, [pending, atom].concat(args)); | ||
return _writeAtomState.apply(void 0, [pending, atom, atomState].concat(args)); | ||
}); | ||
@@ -536,7 +526,6 @@ if (onUnmount) { | ||
}; | ||
var _unmountAtom = function unmountAtom(pending, atom) { | ||
var atomState = getAtomState(atom); | ||
var _unmountAtom = function unmountAtom(pending, atom, atomState) { | ||
if (atomState.m && !atomState.m.l.size && !Array.from(atomState.m.t).some(function (a) { | ||
var _getAtomState$m; | ||
return (_getAtomState$m = getAtomState(a).m) == null ? void 0 : _getAtomState$m.d.has(atom); | ||
return (_getAtomState$m = getAtomState(a, atomState).m) == null ? void 0 : _getAtomState$m.d.has(atom); | ||
})) { | ||
@@ -551,5 +540,5 @@ var onUnmount = atomState.m.u; | ||
} | ||
for (var _iterator8 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step8; !(_step8 = _iterator8()).done;) { | ||
var a = _step8.value; | ||
var aMounted = _unmountAtom(pending, a); | ||
for (var _iterator9 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step9; !(_step9 = _iterator9()).done;) { | ||
var a = _step9.value; | ||
var aMounted = _unmountAtom(pending, a, getAtomState(a, atomState)); | ||
aMounted == null || aMounted.t.delete(atom); | ||
@@ -567,3 +556,4 @@ } | ||
var pending = createPending(); | ||
var mounted = _mountAtom(pending, atom); | ||
var atomState = getAtomState(atom); | ||
var mounted = _mountAtom(pending, atom, atomState); | ||
flushPending(pending); | ||
@@ -575,10 +565,14 @@ var listeners = mounted.l; | ||
var pending = createPending(); | ||
_unmountAtom(pending, atom); | ||
_unmountAtom(pending, atom, atomState); | ||
flushPending(pending); | ||
}; | ||
}; | ||
var unstable_derive = function unstable_derive(fn) { | ||
return _buildStore.apply(void 0, fn(getAtomState)); | ||
}; | ||
var store = { | ||
get: readAtom, | ||
set: writeAtom, | ||
sub: subscribeAtom | ||
sub: subscribeAtom, | ||
unstable_derive: unstable_derive | ||
}; | ||
@@ -588,3 +582,11 @@ { | ||
dev4_get_internal_weak_map: function dev4_get_internal_weak_map() { | ||
return atomStateMap; | ||
return { | ||
get: function get(atom) { | ||
var atomState = getAtomState(atom); | ||
if (atomState.n === 0) { | ||
return undefined; | ||
} | ||
return atomState; | ||
} | ||
}; | ||
}, | ||
@@ -596,15 +598,15 @@ dev4_get_mounted_atoms: function dev4_get_mounted_atoms() { | ||
var pending = createPending(); | ||
for (var _iterator9 = _createForOfIteratorHelperLoose(values), _step9; !(_step9 = _iterator9()).done;) { | ||
var _step9$value = _step9.value, | ||
atom = _step9$value[0], | ||
value = _step9$value[1]; | ||
if (hasInitialValue(atom)) { | ||
var atomState = getAtomState(atom); | ||
for (var _iterator10 = _createForOfIteratorHelperLoose(values), _step10; !(_step10 = _iterator10()).done;) { | ||
var _step10$value = _step10.value, | ||
_atom = _step10$value[0], | ||
value = _step10$value[1]; | ||
if (hasInitialValue(_atom)) { | ||
var atomState = getAtomState(_atom); | ||
var hasPrevValue = 'v' in atomState; | ||
var prevValue = atomState.v; | ||
setAtomStateValueOrPromise(atom, atomState, value); | ||
mountDependencies(pending, atom, atomState); | ||
setAtomStateValueOrPromise(_atom, atomState, value); | ||
mountDependencies(pending, _atom, atomState); | ||
if (!hasPrevValue || !Object.is(prevValue, atomState.v)) { | ||
addPendingAtom(pending, atom, atomState); | ||
recomputeDependents(pending, atom); | ||
addPendingAtom(pending, _atom, atomState); | ||
recomputeDependents(pending, _atom, atomState); | ||
} | ||
@@ -620,2 +622,18 @@ } | ||
}; | ||
var createStore = function createStore() { | ||
var atomStateMap = new WeakMap(); | ||
var getAtomState = function getAtomState(atom) { | ||
var atomState = atomStateMap.get(atom); | ||
if (!atomState) { | ||
atomState = { | ||
d: new Map(), | ||
p: new Set(), | ||
n: 0 | ||
}; | ||
atomStateMap.set(atom, atomState); | ||
} | ||
return atomState; | ||
}; | ||
return _buildStore(getAtomState); | ||
}; | ||
var defaultStore; | ||
@@ -626,4 +644,4 @@ var getDefaultStore = function getDefaultStore() { | ||
{ | ||
var _ref2; | ||
(_ref2 = globalThis).__JOTAI_DEFAULT_STORE__ || (_ref2.__JOTAI_DEFAULT_STORE__ = defaultStore); | ||
var _ref3; | ||
(_ref3 = globalThis).__JOTAI_DEFAULT_STORE__ || (_ref3.__JOTAI_DEFAULT_STORE__ = defaultStore); | ||
if (globalThis.__JOTAI_DEFAULT_STORE__ !== defaultStore) { | ||
@@ -630,0 +648,0 @@ console.warn('Detected multiple Jotai instances. It may cause unexpected behavior with the default store. https://github.com/pmndrs/jotai/discussions/2044'); |
@@ -1,1 +0,1 @@ | ||
!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((n="undefined"!=typeof globalThis?globalThis:n||self).jotaiVanilla={})}(this,(function(n){"use strict";var e=0;function t(n){return n(this)}function r(n,e,t){return e(this,"function"==typeof t?t(n(this)):t)}function o(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=Array(e);t<e;t++)r[t]=n[t];return r}function a(n,e){var t="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(t)return(t=t.call(n)).next.bind(t);if(Array.isArray(n)||(t=function(n,e){if(n){if("string"==typeof n)return o(n,e);var t={}.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(n,e):void 0}}(n))||e){t&&(n=t);var r=0;return function(){return r>=n.length?{done:!0}:{done:!1,value:n[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=function(n,e){return n.unstable_is?n.unstable_is(e):e===n},f=function(n){return"init"in n},l=function(n){return!!n.write},c=Symbol(""),v="pending",d=new WeakMap,s=function(n){return"v"in n||"e"in n},m=function(n){if("e"in n)throw n.e;return n.v},y=function(n){var e,t=n.v;return"object"==typeof(e=t)&&null!==e&&c in e&&t.status===v?t:null},h=function(n,e,t){t.p.has(n)||(t.p.add(n),e.then((function(){t.p.delete(n)}),(function(){t.p.delete(n)})))},p=function(){return[new Map,new Map,new Set]},w=function(n,e,t){n[0].has(e)||n[0].set(e,new Set),n[1].set(e,t)},g=function(n,e){n[2].add(e)},b=function(n){for(;n[1].size||n[2].size;){n[0].clear();var e=new Set(n[1].values());n[1].clear();var t=new Set(n[2]);n[2].clear(),e.forEach((function(n){var e;return null==(e=n.m)?void 0:e.l.forEach((function(n){return n()}))})),t.forEach((function(n){return n()}))}},S=function(){var n=new WeakMap,e=function(e){var t=n.get(e);return t||(t={d:new Map,p:new Set,n:0},n.set(e,t)),t},t=function(n,t,r,o,i){void 0===o&&(o=function(){}),void 0===i&&(i=function(){});var u,f="v"in t,l=t.v,s=y(t);if("function"==typeof(null==(u=r)?void 0:u.then))if(s)s!==r&&(s[c](r,o),++t.n);else{var m=function(n,e,t){if(!d.has(n)){var r,o=new Promise((function(a,i){var u=n,f=function(n){return function(e){u===n&&(o.status="fulfilled",o.value=e,a(e),t())}},l=function(n){return function(e){u===n&&(o.status="rejected",o.reason=e,i(e),t())}};n.then(f(n),l(n)),r=function(n,t){n&&(d.set(n,o),u=n,n.then(f(n),l(n)),e(),e=t)}}));o.status=v,o[c]=r,d.set(n,o)}return d.get(n)}(r,o,i);if(m.status===v)for(var p,w=a(t.d.keys());!(p=w()).done;){var g=p.value,b=e(g);h(n,m,b)}t.v=m,delete t.e}else s&&s[c](Promise.resolve(r),o),t.v=r,delete t.e;f&&Object.is(l,t.v)||++t.n},r=function(n,t,r,o){var a,i=e(t);i.d.set(r,o.n);var u=y(i);u&&h(t,u,o),null==(a=o.m)||a.t.add(t),n&&function(n,e,t){var r=n[0].get(e);r&&r.add(t)}(n,r,t)},o=function(n,a,i){var c=e(a);if((null==i||!i(a))&&s(c)){if(c.m)return c;if(Array.from(c.d).every((function(e){var t=e[0],r=e[1];return o(n,t,i).n===r})))return c}c.d.clear();var v,d,y=!0,h={get signal(){return v||(v=new AbortController),v.signal},get setSelf(){return!d&&l(a)&&(d=function(){if(!y){for(var n=arguments.length,e=new Array(n),t=0;t<n;t++)e[t]=arguments[t];return A.apply(void 0,[a].concat(e))}}),d}};try{var w=a.read((function(l){if(u(a,l)){var v=e(l);if(!s(v)){if(!f(l))throw new Error("no atom init");t(l,v,l.init)}return m(v)}var d=o(n,l,i);if(y)r(n,a,l,d);else{var h=p();r(h,a,l,d),k(h,a,c),b(h)}return m(d)}),h);return t(a,c,w,(function(){var n;return null==(n=v)?void 0:n.abort()}),(function(){if(c.m){var n=p();k(n,a,c),b(n)}})),c}catch(n){return delete c.v,c.e=n,++c.n,c}finally{y=!1}},i=function(n,t){var r=[],i=new Set,u=function(t){if(!i.has(t)){i.add(t);for(var o,f=a(function(t){for(var r,o,i,u=e(t),f=new Set(null==(r=u.m)?void 0:r.t),l=a(u.p);!(i=l()).done;){var c=i.value;f.add(c)}return null==(o=function(n,e){return n[0].get(e)}(n,t))||o.forEach((function(n){f.add(n)})),f}(t));!(o=f()).done;){var l=o.value;t!==l&&u(l)}r.push(t)}};u(t);for(var f=new Set([t]),l=function(n){return i.has(n)},c=r.length-1;c>=0;--c){for(var v,d=r[c],s=e(d),m=s.n,y=!1,h=a(s.d.keys());!(v=h()).done;){var p=v.value;if(p!==d&&f.has(p)){y=!0;break}}y&&(o(n,d,l),k(n,d,s),m!==s.n&&(w(n,d,s),f.add(d))),i.delete(d)}},S=function(n,r){for(var a=arguments.length,l=new Array(a>2?a-2:0),c=2;c<a;c++)l[c-2]=arguments[c];var v=r.write.apply(r,[function(e){return m(o(n,e))},function(o){for(var a,l=arguments.length,c=new Array(l>1?l-1:0),v=1;v<l;v++)c[v-1]=arguments[v];if(u(r,o)){if(!f(o))throw new Error("atom not writable");var d=e(o),s="v"in d,m=d.v,y=c[0];t(o,d,y),k(n,o,d),s&&Object.is(m,d.v)||(w(n,o,d),i(n,o))}else a=S.apply(void 0,[n,o].concat(c));return b(n),a}].concat(l));return v},A=function(n){for(var e=p(),t=arguments.length,r=new Array(t>1?t-1:0),o=1;o<t;o++)r[o-1]=arguments[o];var a=S.apply(void 0,[e,n].concat(r));return b(e),a},k=function(n,e,t){if(t.m&&!y(t)){for(var r,o=a(t.d.keys());!(r=o()).done;){var i=r.value;if(!t.m.d.has(i))j(n,i).t.add(e),t.m.d.add(i)}for(var u,f=a(t.m.d||[]);!(u=f()).done;){var l=u.value;if(!t.d.has(l)){t.m.d.delete(l);var c=M(n,l);null==c||c.t.delete(e)}}}},j=function(n,t){var r=e(t);if(!r.m){o(n,t);for(var i,u=a(r.d.keys());!(i=u()).done;){var f=i.value;j(n,f).t.add(t)}if(r.m={l:new Set,d:new Set(r.d.keys()),t:new Set},l(t)&&t.onMount){var c=r.m,v=t.onMount;g(n,(function(){var e=v((function(){for(var e=arguments.length,r=new Array(e),o=0;o<e;o++)r[o]=arguments[o];return S.apply(void 0,[n,t].concat(r))}));e&&(c.u=e)}))}}return r.m},M=function(n,t){var r=e(t);if(!r.m||r.m.l.size||Array.from(r.m.t).some((function(n){var r;return null==(r=e(n).m)?void 0:r.d.has(t)})))return r.m;var o=r.m.u;o&&g(n,o),delete r.m;for(var i,u=a(r.d.keys());!(i=u()).done;){var f=i.value,l=M(n,f);null==l||l.t.delete(t)}var v=y(r);v&&v[c](void 0,(function(){}))},E={get:function(n){return m(o(void 0,n))},set:A,sub:function(n,e){var t=p(),r=j(t,n);b(t);var o=r.l;return o.add(e),function(){o.delete(e);var t=p();M(t,n),b(t)}}};return E};n.atom=function(n,o){var a="atom"+ ++e,i={toString:function(){return a}};return"function"==typeof n?i.read=n:(i.init=n,i.read=t,i.write=r),o&&(i.write=o),i},n.createStore=S,n.getDefaultStore=function(){return i||(i=S()),i}})); | ||
!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((n="undefined"!=typeof globalThis?globalThis:n||self).jotaiVanilla={})}(this,(function(n){"use strict";var e=0;function t(n){return n(this)}function r(n,e,t){return e(this,"function"==typeof t?t(n(this)):t)}function o(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=Array(e);t<e;t++)r[t]=n[t];return r}function a(n,e){var t="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(t)return(t=t.call(n)).next.bind(t);if(Array.isArray(n)||(t=function(n,e){if(n){if("string"==typeof n)return o(n,e);var t={}.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(n,e):void 0}}(n))||e){t&&(n=t);var r=0;return function(){return r>=n.length?{done:!0}:{done:!1,value:n[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=function(n,e){return n.unstable_is?n.unstable_is(e):e===n},f=function(n){return"init"in n},l=function(n){return!!n.write},c=Symbol(""),v="pending",d=new WeakMap,s=function(n){return"v"in n||"e"in n},m=function(n){if("e"in n)throw n.e;return n.v},p=function(n){var e,t=n.v;return"object"==typeof(e=t)&&null!==e&&c in e&&t.status===v?t:null},y=function(n,e,t){t.p.has(n)||(t.p.add(n),e.then((function(){t.p.delete(n)}),(function(){t.p.delete(n)})))},h=function(n,e,t,r,o){var a;t.d.set(r,o.n);var i=p(t);i&&y(e,i,o),null==(a=o.m)||a.t.add(e),n&&b(n,r,e)},w=function(){return[new Map,new Map,new Set]},g=function(n,e,t){n[0].has(e)||n[0].set(e,new Set),n[1].set(e,t)},b=function(n,e,t){var r=n[0].get(e);r&&r.add(t)},S=function(n,e){n[2].add(e)},A=function(n){for(;n[1].size||n[2].size;){n[0].clear();var e=new Set(n[1].values());n[1].clear();var t=new Set(n[2]);n[2].clear(),e.forEach((function(n){var e;return null==(e=n.m)?void 0:e.l.forEach((function(n){return n()}))})),t.forEach((function(n){return n()}))}},k=function(n){var e=function(e,t,r,o,i){void 0===o&&(o=function(){}),void 0===i&&(i=function(){});var u,f="v"in t,l=t.v,s=p(t);if("function"==typeof(null==(u=r)?void 0:u.then))if(s)s!==r&&(s[c](r,o),++t.n);else{var m=function(n,e,t){if(!d.has(n)){var r,o=new Promise((function(a,i){var u=n,f=function(n){return function(e){u===n&&(o.status="fulfilled",o.value=e,a(e),t())}},l=function(n){return function(e){u===n&&(o.status="rejected",o.reason=e,i(e),t())}};n.then(f(n),l(n)),r=function(n,t){n&&(d.set(n,o),u=n,n.then(f(n),l(n)),e(),e=t)}}));o.status=v,o[c]=r,d.set(n,o)}return d.get(n)}(r,o,i);if(m.status===v)for(var h,w=a(t.d.keys());!(h=w()).done;){var g=h.value;y(e,m,n(g,t))}t.v=m,delete t.e}else s&&s[c](Promise.resolve(r),o),t.v=r,delete t.e;f&&Object.is(l,t.v)||++t.n},t=function(r,o,a,c){if((null==c||!c(o))&&s(a)){if(a.m)return a;if(Array.from(a.d).every((function(e){var o=e[0],i=e[1];return t(r,o,n(o,a),c).n===i})))return a}a.d.clear();var v,d,p=!0,y={get signal(){return v||(v=new AbortController),v.signal},get setSelf(){return!d&&l(o)&&(d=function(){if(!p){for(var n=arguments.length,e=new Array(n),t=0;t<n;t++)e[t]=arguments[t];return i.apply(void 0,[o].concat(e))}}),d}};try{var g=o.read((function(i){if(u(o,i)){var l=n(i,a);if(!s(l)){if(!f(i))throw new Error("no atom init");e(i,l,i.init)}return m(l)}var v=t(r,i,n(i,a),c);if(p)h(r,o,a,i,v);else{var d=w();h(d,o,a,i,v),b(d,o,a),A(d)}return m(v)}),y);return e(o,a,g,(function(){var n;return null==(n=v)?void 0:n.abort()}),(function(){if(a.m){var n=w();b(n,o,a),A(n)}})),a}catch(n){return delete a.v,a.e=n,++a.n,a}finally{p=!1}},r=function(e,r,o){var i=[],u=new Set,f=function(t,r){if(!u.has(t)){u.add(t);for(var o,l=a(function(e,t,r){for(var o,i,u=new Map,f=a((null==(l=r.m)?void 0:l.t)||[]);!(i=f()).done;){var l,c=i.value;u.set(c,n(c,r))}for(var v,d=a(r.p);!(v=d()).done;){var s=v.value;u.set(s,n(s,r))}return null==(o=function(n,e){return n[0].get(e)}(e,t))||o.forEach((function(e){u.set(e,n(e,r))})),u}(e,t,r));!(o=l()).done;){var c=o.value,v=c[0],d=c[1];t!==v&&f(v,d)}i.push([t,r,r.n])}};f(r,o);for(var l=new Set([r]),c=function(n){return u.has(n)},v=i.length-1;v>=0;--v){for(var d,s=i[v],m=s[0],p=s[1],y=s[2],h=!1,w=a(p.d.keys());!(d=w()).done;){var S=d.value;if(S!==m&&l.has(S)){h=!0;break}}h&&(t(e,m,p,c),b(e,m,p),y!==p.n&&(g(e,m,p),l.add(m))),u.delete(m)}},o=function(a,i,l){for(var c=arguments.length,v=new Array(c>3?c-3:0),d=3;d<c;d++)v[d-3]=arguments[d];var s=i.write.apply(i,[function(e){return m(t(a,e,n(e,l)))},function(t){for(var c,v=n(t,l),d=arguments.length,s=new Array(d>1?d-1:0),m=1;m<d;m++)s[m-1]=arguments[m];if(u(i,t)){if(!f(t))throw new Error("atom not writable");var p="v"in v,y=v.v,h=s[0];e(t,v,h),b(a,t,v),p&&Object.is(y,v.v)||(g(a,t,v),r(a,t,v))}else c=o.apply(void 0,[a,t,v].concat(s));return A(a),c}].concat(v));return s},i=function(e){for(var t=w(),r=arguments.length,a=new Array(r>1?r-1:0),i=1;i<r;i++)a[i-1]=arguments[i];var u=o.apply(void 0,[t,e,n(e)].concat(a));return A(t),u},b=function(e,t,r){if(r.m&&!p(r)){for(var o,i=a(r.d.keys());!(o=i()).done;){var u=o.value;if(!r.m.d.has(u))M(e,u,n(u,r)).t.add(t),r.m.d.add(u)}for(var f,l=a(r.m.d||[]);!(f=l()).done;){var c=f.value;if(!r.d.has(c)){r.m.d.delete(c);var v=j(e,c,n(c,r));null==v||v.t.delete(t)}}}},M=function(e,r,i){if(!i.m){t(e,r,i);for(var u,f=a(i.d.keys());!(u=f()).done;){var c=u.value;M(e,c,n(c,i)).t.add(r)}if(i.m={l:new Set,d:new Set(i.d.keys()),t:new Set},l(r)&&r.onMount){var v=i.m,d=r.onMount;S(e,(function(){var n=d((function(){for(var n=arguments.length,t=new Array(n),a=0;a<n;a++)t[a]=arguments[a];return o.apply(void 0,[e,r,i].concat(t))}));n&&(v.u=n)}))}}return i.m},j=function(e,t,r){if(!r.m||r.m.l.size||Array.from(r.m.t).some((function(e){var o;return null==(o=n(e,r).m)?void 0:o.d.has(t)})))return r.m;var o=r.m.u;o&&S(e,o),delete r.m;for(var i,u=a(r.d.keys());!(i=u()).done;){var f=i.value,l=j(e,f,n(f,r));null==l||l.t.delete(t)}var v=p(r);v&&v[c](void 0,(function(){}))},E={get:function(e){return m(t(void 0,e,n(e)))},set:i,sub:function(e,t){var r=w(),o=n(e),a=M(r,e,o);A(r);var i=a.l;return i.add(t),function(){i.delete(t);var n=w();j(n,e,o),A(n)}},unstable_derive:function(e){return k.apply(void 0,e(n))}};return E},M=function(){var n=new WeakMap;return k((function(e){var t=n.get(e);return t||(t={d:new Map,p:new Set,n:0},n.set(e,t)),t}))};n.atom=function(n,o){var a="atom"+ ++e,i={toString:function(){return a}};return"function"==typeof n?i.read=n:(i.init=n,i.read=t,i.write=r),o&&(i.write=o),i},n.createStore=M,n.getDefaultStore=function(){return i||(i=M()),i}})); |
242
vanilla.js
@@ -151,2 +151,17 @@ 'use strict'; | ||
}; | ||
var addDependency = function addDependency(pending, atom, atomState, a, aState) { | ||
var _aState$m; | ||
if (process.env.NODE_ENV !== 'production' && a === atom) { | ||
throw new Error('[Bug] atom cannot depend on itself'); | ||
} | ||
atomState.d.set(a, aState.n); | ||
var continuablePromise = getPendingContinuablePromise(atomState); | ||
if (continuablePromise) { | ||
addPendingContinuablePromiseToDependency(atom, continuablePromise, aState); | ||
} | ||
(_aState$m = aState.m) == null || _aState$m.t.add(atom); | ||
if (pending) { | ||
addPendingDependent(pending, a, atom); | ||
} | ||
}; | ||
var createPending = function createPending() { | ||
@@ -191,4 +206,3 @@ return [new Map(), new Map(), new Set()]; | ||
}; | ||
var createStore = function createStore() { | ||
var atomStateMap = new WeakMap(); | ||
var _buildStore = function buildStore(getAtomState) { | ||
var debugMountedAtoms; | ||
@@ -198,14 +212,2 @@ if (process.env.NODE_ENV !== 'production') { | ||
} | ||
var getAtomState = function getAtomState(atom) { | ||
var atomState = atomStateMap.get(atom); | ||
if (!atomState) { | ||
atomState = { | ||
d: new Map(), | ||
p: new Set(), | ||
n: 0 | ||
}; | ||
atomStateMap.set(atom, atomState); | ||
} | ||
return atomState; | ||
}; | ||
var setAtomStateValueOrPromise = function setAtomStateValueOrPromise(atom, atomState, valueOrPromise, abortPromise, completePromise) { | ||
@@ -232,4 +234,3 @@ if (abortPromise === void 0) { | ||
var a = _step.value; | ||
var aState = getAtomState(a); | ||
addPendingContinuablePromiseToDependency(atom, continuablePromise, aState); | ||
addPendingContinuablePromiseToDependency(atom, continuablePromise, getAtomState(a, atomState)); | ||
} | ||
@@ -251,20 +252,3 @@ } | ||
}; | ||
var addDependency = function addDependency(pending, atom, a, aState) { | ||
var _aState$m; | ||
if (process.env.NODE_ENV !== 'production' && a === atom) { | ||
throw new Error('[Bug] atom cannot depend on itself'); | ||
} | ||
var atomState = getAtomState(atom); | ||
atomState.d.set(a, aState.n); | ||
var continuablePromise = getPendingContinuablePromise(atomState); | ||
if (continuablePromise) { | ||
addPendingContinuablePromiseToDependency(atom, continuablePromise, aState); | ||
} | ||
(_aState$m = aState.m) == null || _aState$m.t.add(atom); | ||
if (pending) { | ||
addPendingDependent(pending, a, atom); | ||
} | ||
}; | ||
var _readAtomState = function readAtomState(pending, atom, force) { | ||
var atomState = getAtomState(atom); | ||
var _readAtomState = function readAtomState(pending, atom, atomState, force) { | ||
if (!(force != null && force(atom)) && isAtomStateInitialized(atomState)) { | ||
@@ -277,3 +261,3 @@ if (atomState.m) { | ||
n = _ref[1]; | ||
return _readAtomState(pending, a, force).n === n; | ||
return _readAtomState(pending, a, getAtomState(a, atomState), force).n === n; | ||
})) { | ||
@@ -287,3 +271,3 @@ return atomState; | ||
if (isSelfAtom(atom, a)) { | ||
var _aState = getAtomState(a); | ||
var _aState = getAtomState(a, atomState); | ||
if (!isAtomStateInitialized(_aState)) { | ||
@@ -298,8 +282,8 @@ if (hasInitialValue(a)) { | ||
} | ||
var aState = _readAtomState(pending, a, force); | ||
var aState = _readAtomState(pending, a, getAtomState(a, atomState), force); | ||
if (isSync) { | ||
addDependency(pending, atom, a, aState); | ||
addDependency(pending, atom, atomState, a, aState); | ||
} else { | ||
var _pending = createPending(); | ||
addDependency(_pending, atom, a, aState); | ||
addDependency(_pending, atom, atomState, a, aState); | ||
mountDependencies(_pending, atom, atomState); | ||
@@ -362,34 +346,40 @@ flushPending(_pending); | ||
var readAtom = function readAtom(atom) { | ||
return returnAtomValue(_readAtomState(undefined, atom)); | ||
return returnAtomValue(_readAtomState(undefined, atom, getAtomState(atom))); | ||
}; | ||
var recomputeDependents = function recomputeDependents(pending, atom) { | ||
var getDependents = function getDependents(a) { | ||
var _aState$m2, _getPendingDependents; | ||
var aState = getAtomState(a); | ||
var dependents = new Set((_aState$m2 = aState.m) == null ? void 0 : _aState$m2.t); | ||
for (var _iterator2 = _createForOfIteratorHelperLoose(aState.p), _step2; !(_step2 = _iterator2()).done;) { | ||
var atomWithPendingContinuablePromise = _step2.value; | ||
dependents.add(atomWithPendingContinuablePromise); | ||
} | ||
(_getPendingDependents = getPendingDependents(pending, a)) == null || _getPendingDependents.forEach(function (dependent) { | ||
dependents.add(dependent); | ||
}); | ||
return dependents; | ||
}; | ||
var getDependents = function getDependents(pending, atom, atomState) { | ||
var _getPendingDependents; | ||
var dependents = new Map(); | ||
for (var _iterator2 = _createForOfIteratorHelperLoose(((_atomState$m2 = atomState.m) == null ? void 0 : _atomState$m2.t) || []), _step2; !(_step2 = _iterator2()).done;) { | ||
var _atomState$m2; | ||
var a = _step2.value; | ||
dependents.set(a, getAtomState(a, atomState)); | ||
} | ||
for (var _iterator3 = _createForOfIteratorHelperLoose(atomState.p), _step3; !(_step3 = _iterator3()).done;) { | ||
var atomWithPendingContinuablePromise = _step3.value; | ||
dependents.set(atomWithPendingContinuablePromise, getAtomState(atomWithPendingContinuablePromise, atomState)); | ||
} | ||
(_getPendingDependents = getPendingDependents(pending, atom)) == null || _getPendingDependents.forEach(function (dependent) { | ||
dependents.set(dependent, getAtomState(dependent, atomState)); | ||
}); | ||
return dependents; | ||
}; | ||
var recomputeDependents = function recomputeDependents(pending, atom, atomState) { | ||
var topsortedAtoms = []; | ||
var markedAtoms = new Set(); | ||
var _visit = function visit(n) { | ||
if (markedAtoms.has(n)) { | ||
var _visit = function visit(a, aState) { | ||
if (markedAtoms.has(a)) { | ||
return; | ||
} | ||
markedAtoms.add(n); | ||
for (var _iterator3 = _createForOfIteratorHelperLoose(getDependents(n)), _step3; !(_step3 = _iterator3()).done;) { | ||
var m = _step3.value; | ||
if (n !== m) { | ||
_visit(m); | ||
markedAtoms.add(a); | ||
for (var _iterator4 = _createForOfIteratorHelperLoose(getDependents(pending, a, aState)), _step4; !(_step4 = _iterator4()).done;) { | ||
var _step4$value = _step4.value, | ||
d = _step4$value[0], | ||
s = _step4$value[1]; | ||
if (a !== d) { | ||
_visit(d, s); | ||
} | ||
} | ||
topsortedAtoms.push(n); | ||
topsortedAtoms.push([a, aState, aState.n]); | ||
}; | ||
_visit(atom); | ||
_visit(atom, atomState); | ||
var changedAtoms = new Set([atom]); | ||
@@ -400,8 +390,9 @@ var isMarked = function isMarked(a) { | ||
for (var i = topsortedAtoms.length - 1; i >= 0; --i) { | ||
var a = topsortedAtoms[i]; | ||
var aState = getAtomState(a); | ||
var prevEpochNumber = aState.n; | ||
var _ref2 = topsortedAtoms[i], | ||
a = _ref2[0], | ||
aState = _ref2[1], | ||
prevEpochNumber = _ref2[2]; | ||
var hasChangedDeps = false; | ||
for (var _iterator4 = _createForOfIteratorHelperLoose(aState.d.keys()), _step4; !(_step4 = _iterator4()).done;) { | ||
var dep = _step4.value; | ||
for (var _iterator5 = _createForOfIteratorHelperLoose(aState.d.keys()), _step5; !(_step5 = _iterator5()).done;) { | ||
var dep = _step5.value; | ||
if (dep !== a && changedAtoms.has(dep)) { | ||
@@ -413,3 +404,3 @@ hasChangedDeps = true; | ||
if (hasChangedDeps) { | ||
_readAtomState(pending, a, isMarked); | ||
_readAtomState(pending, a, aState, isMarked); | ||
mountDependencies(pending, a, aState); | ||
@@ -424,7 +415,8 @@ if (prevEpochNumber !== aState.n) { | ||
}; | ||
var _writeAtomState = function writeAtomState(pending, atom) { | ||
var _writeAtomState = function writeAtomState(pending, atom, atomState) { | ||
var getter = function getter(a) { | ||
return returnAtomValue(_readAtomState(pending, a)); | ||
return returnAtomValue(_readAtomState(pending, a, getAtomState(a, atomState))); | ||
}; | ||
var setter = function setter(a) { | ||
var aState = getAtomState(a, atomState); | ||
var r; | ||
@@ -438,3 +430,2 @@ for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { | ||
} | ||
var aState = getAtomState(a); | ||
var hasPrevValue = 'v' in aState; | ||
@@ -447,6 +438,6 @@ var prevValue = aState.v; | ||
addPendingAtom(pending, a, aState); | ||
recomputeDependents(pending, a); | ||
recomputeDependents(pending, a, aState); | ||
} | ||
} else { | ||
r = _writeAtomState.apply(void 0, [pending, a].concat(args)); | ||
r = _writeAtomState.apply(void 0, [pending, a, aState].concat(args)); | ||
} | ||
@@ -456,4 +447,4 @@ flushPending(pending); | ||
}; | ||
for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { | ||
args[_key2 - 2] = arguments[_key2]; | ||
for (var _len2 = arguments.length, args = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) { | ||
args[_key2 - 3] = arguments[_key2]; | ||
} | ||
@@ -468,3 +459,3 @@ var result = atom.write.apply(atom, [getter, setter].concat(args)); | ||
} | ||
var result = _writeAtomState.apply(void 0, [pending, atom].concat(args)); | ||
var result = _writeAtomState.apply(void 0, [pending, atom, getAtomState(atom)].concat(args)); | ||
flushPending(pending); | ||
@@ -475,6 +466,6 @@ return result; | ||
if (atomState.m && !getPendingContinuablePromise(atomState)) { | ||
for (var _iterator5 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step5; !(_step5 = _iterator5()).done;) { | ||
var a = _step5.value; | ||
for (var _iterator6 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step6; !(_step6 = _iterator6()).done;) { | ||
var a = _step6.value; | ||
if (!atomState.m.d.has(a)) { | ||
var aMounted = _mountAtom(pending, a); | ||
var aMounted = _mountAtom(pending, a, getAtomState(a, atomState)); | ||
aMounted.t.add(atom); | ||
@@ -484,7 +475,7 @@ atomState.m.d.add(a); | ||
} | ||
for (var _iterator6 = _createForOfIteratorHelperLoose(atomState.m.d || []), _step6; !(_step6 = _iterator6()).done;) { | ||
var _a = _step6.value; | ||
for (var _iterator7 = _createForOfIteratorHelperLoose(atomState.m.d || []), _step7; !(_step7 = _iterator7()).done;) { | ||
var _a = _step7.value; | ||
if (!atomState.d.has(_a)) { | ||
atomState.m.d.delete(_a); | ||
var _aMounted = _unmountAtom(pending, _a); | ||
var _aMounted = _unmountAtom(pending, _a, getAtomState(_a, atomState)); | ||
_aMounted == null || _aMounted.t.delete(atom); | ||
@@ -495,9 +486,8 @@ } | ||
}; | ||
var _mountAtom = function mountAtom(pending, atom) { | ||
var atomState = getAtomState(atom); | ||
var _mountAtom = function mountAtom(pending, atom, atomState) { | ||
if (!atomState.m) { | ||
_readAtomState(pending, atom); | ||
for (var _iterator7 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step7; !(_step7 = _iterator7()).done;) { | ||
var a = _step7.value; | ||
var aMounted = _mountAtom(pending, a); | ||
_readAtomState(pending, atom, atomState); | ||
for (var _iterator8 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step8; !(_step8 = _iterator8()).done;) { | ||
var a = _step8.value; | ||
var aMounted = _mountAtom(pending, a, getAtomState(a, atomState)); | ||
aMounted.t.add(atom); | ||
@@ -521,3 +511,3 @@ } | ||
} | ||
return _writeAtomState.apply(void 0, [pending, atom].concat(args)); | ||
return _writeAtomState.apply(void 0, [pending, atom, atomState].concat(args)); | ||
}); | ||
@@ -532,7 +522,6 @@ if (onUnmount) { | ||
}; | ||
var _unmountAtom = function unmountAtom(pending, atom) { | ||
var atomState = getAtomState(atom); | ||
var _unmountAtom = function unmountAtom(pending, atom, atomState) { | ||
if (atomState.m && !atomState.m.l.size && !Array.from(atomState.m.t).some(function (a) { | ||
var _getAtomState$m; | ||
return (_getAtomState$m = getAtomState(a).m) == null ? void 0 : _getAtomState$m.d.has(atom); | ||
return (_getAtomState$m = getAtomState(a, atomState).m) == null ? void 0 : _getAtomState$m.d.has(atom); | ||
})) { | ||
@@ -547,5 +536,5 @@ var onUnmount = atomState.m.u; | ||
} | ||
for (var _iterator8 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step8; !(_step8 = _iterator8()).done;) { | ||
var a = _step8.value; | ||
var aMounted = _unmountAtom(pending, a); | ||
for (var _iterator9 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step9; !(_step9 = _iterator9()).done;) { | ||
var a = _step9.value; | ||
var aMounted = _unmountAtom(pending, a, getAtomState(a, atomState)); | ||
aMounted == null || aMounted.t.delete(atom); | ||
@@ -563,3 +552,4 @@ } | ||
var pending = createPending(); | ||
var mounted = _mountAtom(pending, atom); | ||
var atomState = getAtomState(atom); | ||
var mounted = _mountAtom(pending, atom, atomState); | ||
flushPending(pending); | ||
@@ -571,10 +561,14 @@ var listeners = mounted.l; | ||
var pending = createPending(); | ||
_unmountAtom(pending, atom); | ||
_unmountAtom(pending, atom, atomState); | ||
flushPending(pending); | ||
}; | ||
}; | ||
var unstable_derive = function unstable_derive(fn) { | ||
return _buildStore.apply(void 0, fn(getAtomState)); | ||
}; | ||
var store = { | ||
get: readAtom, | ||
set: writeAtom, | ||
sub: subscribeAtom | ||
sub: subscribeAtom, | ||
unstable_derive: unstable_derive | ||
}; | ||
@@ -584,3 +578,11 @@ if (process.env.NODE_ENV !== 'production') { | ||
dev4_get_internal_weak_map: function dev4_get_internal_weak_map() { | ||
return atomStateMap; | ||
return { | ||
get: function get(atom) { | ||
var atomState = getAtomState(atom); | ||
if (atomState.n === 0) { | ||
return undefined; | ||
} | ||
return atomState; | ||
} | ||
}; | ||
}, | ||
@@ -592,15 +594,15 @@ dev4_get_mounted_atoms: function dev4_get_mounted_atoms() { | ||
var pending = createPending(); | ||
for (var _iterator9 = _createForOfIteratorHelperLoose(values), _step9; !(_step9 = _iterator9()).done;) { | ||
var _step9$value = _step9.value, | ||
atom = _step9$value[0], | ||
value = _step9$value[1]; | ||
if (hasInitialValue(atom)) { | ||
var atomState = getAtomState(atom); | ||
for (var _iterator10 = _createForOfIteratorHelperLoose(values), _step10; !(_step10 = _iterator10()).done;) { | ||
var _step10$value = _step10.value, | ||
_atom = _step10$value[0], | ||
value = _step10$value[1]; | ||
if (hasInitialValue(_atom)) { | ||
var atomState = getAtomState(_atom); | ||
var hasPrevValue = 'v' in atomState; | ||
var prevValue = atomState.v; | ||
setAtomStateValueOrPromise(atom, atomState, value); | ||
mountDependencies(pending, atom, atomState); | ||
setAtomStateValueOrPromise(_atom, atomState, value); | ||
mountDependencies(pending, _atom, atomState); | ||
if (!hasPrevValue || !Object.is(prevValue, atomState.v)) { | ||
addPendingAtom(pending, atom, atomState); | ||
recomputeDependents(pending, atom); | ||
addPendingAtom(pending, _atom, atomState); | ||
recomputeDependents(pending, _atom, atomState); | ||
} | ||
@@ -616,2 +618,18 @@ } | ||
}; | ||
var createStore = function createStore() { | ||
var atomStateMap = new WeakMap(); | ||
var getAtomState = function getAtomState(atom) { | ||
var atomState = atomStateMap.get(atom); | ||
if (!atomState) { | ||
atomState = { | ||
d: new Map(), | ||
p: new Set(), | ||
n: 0 | ||
}; | ||
atomStateMap.set(atom, atomState); | ||
} | ||
return atomState; | ||
}; | ||
return _buildStore(getAtomState); | ||
}; | ||
var defaultStore; | ||
@@ -622,4 +640,4 @@ var getDefaultStore = function getDefaultStore() { | ||
if (process.env.NODE_ENV !== 'production') { | ||
var _ref2; | ||
(_ref2 = globalThis).__JOTAI_DEFAULT_STORE__ || (_ref2.__JOTAI_DEFAULT_STORE__ = defaultStore); | ||
var _ref3; | ||
(_ref3 = globalThis).__JOTAI_DEFAULT_STORE__ || (_ref3.__JOTAI_DEFAULT_STORE__ = defaultStore); | ||
if (globalThis.__JOTAI_DEFAULT_STORE__ !== defaultStore) { | ||
@@ -626,0 +644,0 @@ console.warn('Detected multiple Jotai instances. It may cause unexpected behavior with the default store. https://github.com/pmndrs/jotai/discussions/2044'); |
@@ -48,4 +48,10 @@ import type { Atom, WritableAtom } from './atom'; | ||
}; | ||
type GetAtomState = <Value>(atom: Atom<Value>, originAtomState?: AtomState) => AtomState<Value>; | ||
type StoreArgs = readonly [ | ||
getAtomState: GetAtomState | ||
]; | ||
type DevStoreRev4 = { | ||
dev4_get_internal_weak_map: () => WeakMap<AnyAtom, AtomState>; | ||
dev4_get_internal_weak_map: () => { | ||
get: (atom: AnyAtom) => AtomState | undefined; | ||
}; | ||
dev4_get_mounted_atoms: () => Set<AnyAtom>; | ||
@@ -58,2 +64,3 @@ dev4_restore_atoms: (values: Iterable<readonly [AnyAtom, AnyValue]>) => void; | ||
sub: (atom: AnyAtom, listener: () => void) => () => void; | ||
unstable_derive: (fn: (...args: StoreArgs) => StoreArgs) => Store; | ||
}; | ||
@@ -60,0 +67,0 @@ type Store = PrdStore | (PrdStore & DevStoreRev4); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
427911
9329