Comparing version 2.10.4 to 2.11.0
@@ -6,3 +6,3 @@ { | ||
"type": "commonjs", | ||
"version": "2.10.4", | ||
"version": "2.11.0", | ||
"main": "./index.js", | ||
@@ -97,8 +97,3 @@ "types": "./index.d.ts", | ||
} | ||
}, | ||
"pnpm": { | ||
"patchedDependencies": { | ||
"@testing-library/react@16.1.0": "patches/@testing-library__react@16.1.0.patch" | ||
} | ||
} | ||
} |
@@ -93,3 +93,3 @@ System.register([], (function (exports) { | ||
}; | ||
const addDependency = (pending, atom, atomState, a, aState) => { | ||
const addDependency = (batch, atom, atomState, a, aState) => { | ||
var _a; | ||
@@ -104,15 +104,26 @@ if (a === atom) { | ||
(_a = aState.m) == null ? void 0 : _a.t.add(atom); | ||
if (pending) { | ||
addPendingDependent(pending, a, atom); | ||
if (batch) { | ||
addBatchAtomDependent(batch, a, atom); | ||
} | ||
}; | ||
const createPending = () => [/* @__PURE__ */ new Map(), /* @__PURE__ */ new Map(), /* @__PURE__ */ new Set()]; | ||
const addPendingAtom = (pending, atom, atomState) => { | ||
if (!pending[0].has(atom)) { | ||
pending[0].set(atom, /* @__PURE__ */ new Set()); | ||
const createBatch = () => ({ | ||
D: /* @__PURE__ */ new Map(), | ||
H: /* @__PURE__ */ new Set(), | ||
M: /* @__PURE__ */ new Set(), | ||
L: /* @__PURE__ */ new Set() | ||
}); | ||
const addBatchFunc = (batch, priority, fn) => { | ||
batch[priority].add(fn); | ||
}; | ||
const registerBatchAtom = (batch, atom, atomState) => { | ||
if (!batch.D.has(atom)) { | ||
batch.D.set(atom, /* @__PURE__ */ new Set()); | ||
addBatchFunc(batch, "M", () => { | ||
var _a; | ||
(_a = atomState.m) == null ? void 0 : _a.l.forEach((listener) => addBatchFunc(batch, "M", listener)); | ||
}); | ||
} | ||
pending[1].set(atom, atomState); | ||
}; | ||
const addPendingDependent = (pending, atom, dependent) => { | ||
const dependents = pending[0].get(atom); | ||
const addBatchAtomDependent = (batch, atom, dependent) => { | ||
const dependents = batch.D.get(atom); | ||
if (dependents) { | ||
@@ -122,7 +133,4 @@ dependents.add(dependent); | ||
}; | ||
const getPendingDependents = (pending, atom) => pending[0].get(atom); | ||
const addPendingFunction = (pending, fn) => { | ||
pending[2].add(fn); | ||
}; | ||
const flushPending = (pending) => { | ||
const getBatchAtomDependents = (batch, atom) => batch.D.get(atom); | ||
const flushBatch = (batch) => { | ||
let error; | ||
@@ -140,13 +148,10 @@ let hasError = false; | ||
}; | ||
while (pending[1].size || pending[2].size) { | ||
pending[0].clear(); | ||
const atomStates = new Set(pending[1].values()); | ||
pending[1].clear(); | ||
const functions = new Set(pending[2]); | ||
pending[2].clear(); | ||
atomStates.forEach((atomState) => { | ||
var _a; | ||
return (_a = atomState.m) == null ? void 0 : _a.l.forEach(call); | ||
}); | ||
functions.forEach(call); | ||
while (batch.H.size || batch.M.size || batch.L.size) { | ||
batch.D.clear(); | ||
batch.H.forEach(call); | ||
batch.H.clear(); | ||
batch.M.forEach(call); | ||
batch.M.clear(); | ||
batch.L.forEach(call); | ||
batch.L.clear(); | ||
} | ||
@@ -158,6 +163,2 @@ if (hasError) { | ||
const buildStore = (...[getAtomState, atomRead, atomWrite, atomOnMount]) => { | ||
let debugMountedAtoms; | ||
{ | ||
debugMountedAtoms = /* @__PURE__ */ new Set(); | ||
} | ||
const setAtomStateValueOrPromise = (atom, atomState, valueOrPromise) => { | ||
@@ -173,7 +174,7 @@ const hasPrevValue = "v" in atomState; | ||
atomState.v = valueOrPromise; | ||
delete atomState.e; | ||
} else { | ||
atomState.v = valueOrPromise; | ||
delete atomState.e; | ||
} | ||
delete atomState.e; | ||
delete atomState.x; | ||
if (!hasPrevValue || !Object.is(prevValue, atomState.v)) { | ||
@@ -186,7 +187,7 @@ ++atomState.n; | ||
}; | ||
const readAtomState = (pending, atom, dirtyAtoms) => { | ||
const readAtomState = (batch, atom) => { | ||
var _a; | ||
const atomState = getAtomState(atom); | ||
if (isAtomStateInitialized(atomState)) { | ||
if (atomState.m && !(dirtyAtoms == null ? void 0 : dirtyAtoms.has(atom))) { | ||
if (atomState.m && !atomState.x) { | ||
return atomState; | ||
@@ -198,3 +199,3 @@ } | ||
// check if the atom epoch number is unchanged | ||
readAtomState(pending, a, dirtyAtoms).n === n | ||
readAtomState(batch, a).n === n | ||
) | ||
@@ -219,3 +220,3 @@ )) { | ||
} | ||
const aState = readAtomState(pending, a, dirtyAtoms); | ||
const aState = readAtomState(batch, a); | ||
try { | ||
@@ -225,8 +226,8 @@ return returnAtomValue(aState); | ||
if (isSync) { | ||
addDependency(pending, atom, atomState, a, aState); | ||
addDependency(batch, atom, atomState, a, aState); | ||
} else { | ||
const pending2 = createPending(); | ||
addDependency(pending2, atom, atomState, a, aState); | ||
mountDependencies(pending2, atom, atomState); | ||
flushPending(pending2); | ||
const batch2 = createBatch(); | ||
addDependency(batch2, atom, atomState, a, aState); | ||
mountDependencies(batch2, atom, atomState); | ||
flushBatch(batch2); | ||
} | ||
@@ -268,5 +269,5 @@ } | ||
if (atomState.m) { | ||
const pending2 = createPending(); | ||
mountDependencies(pending2, atom, atomState); | ||
flushPending(pending2); | ||
const batch2 = createBatch(); | ||
mountDependencies(batch2, atom, atomState); | ||
flushBatch(batch2); | ||
} | ||
@@ -280,2 +281,3 @@ }; | ||
atomState.e = error; | ||
delete atomState.x; | ||
++atomState.n; | ||
@@ -288,3 +290,3 @@ return atomState; | ||
const readAtom = (atom) => returnAtomValue(readAtomState(void 0, atom)); | ||
const getMountedOrPendingDependents = (pending, atom, atomState) => { | ||
const getMountedOrBatchDependents = (batch, atom, atomState) => { | ||
var _a, _b; | ||
@@ -304,3 +306,3 @@ const dependents = /* @__PURE__ */ new Map(); | ||
} | ||
(_b = getPendingDependents(pending, atom)) == null ? void 0 : _b.forEach((dependent) => { | ||
(_b = getBatchAtomDependents(batch, atom)) == null ? void 0 : _b.forEach((dependent) => { | ||
dependents.set(dependent, getAtomState(dependent)); | ||
@@ -310,7 +312,7 @@ }); | ||
}; | ||
function getSortedDependents(pending, rootAtom, rootAtomState) { | ||
const sorted = []; | ||
const recomputeDependents = (batch, atom, atomState) => { | ||
const topSortedReversed = []; | ||
const visiting = /* @__PURE__ */ new Set(); | ||
const visited = /* @__PURE__ */ new Set(); | ||
const stack = [[rootAtom, rootAtomState]]; | ||
const stack = [[atom, atomState]]; | ||
while (stack.length > 0) { | ||
@@ -323,4 +325,5 @@ const [a, aState] = stack[stack.length - 1]; | ||
if (visiting.has(a)) { | ||
sorted.push([a, aState, aState.n]); | ||
topSortedReversed.push([a, aState, aState.n]); | ||
visited.add(a); | ||
aState.x = true; | ||
stack.pop(); | ||
@@ -330,3 +333,3 @@ continue; | ||
visiting.add(a); | ||
for (const [d, s] of getMountedOrPendingDependents(pending, a, aState)) { | ||
for (const [d, s] of getMountedOrBatchDependents(batch, a, aState)) { | ||
if (a !== d && !visiting.has(d)) { | ||
@@ -337,34 +340,28 @@ stack.push([d, s]); | ||
} | ||
return [sorted, visited]; | ||
} | ||
const recomputeDependents = (pending, atom, atomState) => { | ||
const [topsortedAtoms, markedAtoms] = getSortedDependents( | ||
pending, | ||
atom, | ||
atomState | ||
); | ||
const changedAtoms = /* @__PURE__ */ new Set([atom]); | ||
for (let i = topsortedAtoms.length - 1; i >= 0; --i) { | ||
const [a, aState, prevEpochNumber] = topsortedAtoms[i]; | ||
let hasChangedDeps = false; | ||
for (const dep of aState.d.keys()) { | ||
if (dep !== a && changedAtoms.has(dep)) { | ||
hasChangedDeps = true; | ||
break; | ||
addBatchFunc(batch, "H", () => { | ||
const changedAtoms = /* @__PURE__ */ new Set([atom]); | ||
for (let i = topSortedReversed.length - 1; i >= 0; --i) { | ||
const [a, aState, prevEpochNumber] = topSortedReversed[i]; | ||
let hasChangedDeps = false; | ||
for (const dep of aState.d.keys()) { | ||
if (dep !== a && changedAtoms.has(dep)) { | ||
hasChangedDeps = true; | ||
break; | ||
} | ||
} | ||
} | ||
if (hasChangedDeps) { | ||
readAtomState(pending, a, markedAtoms); | ||
mountDependencies(pending, a, aState); | ||
if (prevEpochNumber !== aState.n) { | ||
addPendingAtom(pending, a, aState); | ||
changedAtoms.add(a); | ||
if (hasChangedDeps) { | ||
readAtomState(batch, a); | ||
mountDependencies(batch, a, aState); | ||
if (prevEpochNumber !== aState.n) { | ||
registerBatchAtom(batch, a, aState); | ||
changedAtoms.add(a); | ||
} | ||
} | ||
delete aState.x; | ||
} | ||
markedAtoms.delete(a); | ||
} | ||
}); | ||
}; | ||
const writeAtomState = (pending, atom, ...args) => { | ||
const writeAtomState = (batch, atom, ...args) => { | ||
let isSync = true; | ||
const getter = (a) => returnAtomValue(readAtomState(pending, a)); | ||
const getter = (a) => returnAtomValue(readAtomState(batch, a)); | ||
const setter = (a, ...args2) => { | ||
@@ -380,14 +377,14 @@ const aState = getAtomState(a); | ||
setAtomStateValueOrPromise(a, aState, v); | ||
mountDependencies(pending, a, aState); | ||
mountDependencies(batch, a, aState); | ||
if (prevEpochNumber !== aState.n) { | ||
addPendingAtom(pending, a, aState); | ||
recomputeDependents(pending, a, aState); | ||
registerBatchAtom(batch, a, aState); | ||
recomputeDependents(batch, a, aState); | ||
} | ||
return void 0; | ||
} else { | ||
return writeAtomState(pending, a, ...args2); | ||
return writeAtomState(batch, a, ...args2); | ||
} | ||
} finally { | ||
if (!isSync) { | ||
flushPending(pending); | ||
flushBatch(batch); | ||
} | ||
@@ -403,14 +400,14 @@ } | ||
const writeAtom = (atom, ...args) => { | ||
const pending = createPending(); | ||
const batch = createBatch(); | ||
try { | ||
return writeAtomState(pending, atom, ...args); | ||
return writeAtomState(batch, atom, ...args); | ||
} finally { | ||
flushPending(pending); | ||
flushBatch(batch); | ||
} | ||
}; | ||
const mountDependencies = (pending, atom, atomState) => { | ||
const mountDependencies = (batch, atom, atomState) => { | ||
if (atomState.m && !isPendingPromise(atomState.v)) { | ||
for (const a of atomState.d.keys()) { | ||
if (!atomState.m.d.has(a)) { | ||
const aMounted = mountAtom(pending, a, getAtomState(a)); | ||
const aMounted = mountAtom(batch, a, getAtomState(a)); | ||
aMounted.t.add(atom); | ||
@@ -423,3 +420,3 @@ atomState.m.d.add(a); | ||
atomState.m.d.delete(a); | ||
const aMounted = unmountAtom(pending, a, getAtomState(a)); | ||
const aMounted = unmountAtom(batch, a, getAtomState(a)); | ||
aMounted == null ? void 0 : aMounted.t.delete(atom); | ||
@@ -430,7 +427,7 @@ } | ||
}; | ||
const mountAtom = (pending, atom, atomState) => { | ||
const mountAtom = (batch, atom, atomState) => { | ||
if (!atomState.m) { | ||
readAtomState(pending, atom); | ||
readAtomState(batch, atom); | ||
for (const a of atomState.d.keys()) { | ||
const aMounted = mountAtom(pending, a, getAtomState(a)); | ||
const aMounted = mountAtom(batch, a, getAtomState(a)); | ||
aMounted.t.add(atom); | ||
@@ -443,16 +440,13 @@ } | ||
}; | ||
{ | ||
debugMountedAtoms.add(atom); | ||
} | ||
if (isActuallyWritableAtom(atom)) { | ||
const mounted = atomState.m; | ||
let setAtom; | ||
const createInvocationContext = (pending2, fn) => { | ||
const createInvocationContext = (batch2, fn) => { | ||
let isSync = true; | ||
setAtom = (...args) => { | ||
try { | ||
return writeAtomState(pending2, atom, ...args); | ||
return writeAtomState(batch2, atom, ...args); | ||
} finally { | ||
if (!isSync) { | ||
flushPending(pending2); | ||
flushBatch(batch2); | ||
} | ||
@@ -467,9 +461,9 @@ } | ||
}; | ||
addPendingFunction(pending, () => { | ||
addBatchFunc(batch, "L", () => { | ||
const onUnmount = createInvocationContext( | ||
pending, | ||
batch, | ||
() => atomOnMount(atom, (...args) => setAtom(...args)) | ||
); | ||
if (onUnmount) { | ||
mounted.u = (pending2) => createInvocationContext(pending2, onUnmount); | ||
mounted.u = (batch2) => createInvocationContext(batch2, onUnmount); | ||
} | ||
@@ -481,3 +475,3 @@ }); | ||
}; | ||
const unmountAtom = (pending, atom, atomState) => { | ||
const unmountAtom = (batch, atom, atomState) => { | ||
if (atomState.m && !atomState.m.l.size && !Array.from(atomState.m.t).some((a) => { | ||
@@ -489,10 +483,7 @@ var _a; | ||
if (onUnmount) { | ||
addPendingFunction(pending, () => onUnmount(pending)); | ||
addBatchFunc(batch, "L", () => onUnmount(batch)); | ||
} | ||
delete atomState.m; | ||
{ | ||
debugMountedAtoms.delete(atom); | ||
} | ||
for (const a of atomState.d.keys()) { | ||
const aMounted = unmountAtom(pending, a, getAtomState(a)); | ||
const aMounted = unmountAtom(batch, a, getAtomState(a)); | ||
aMounted == null ? void 0 : aMounted.t.delete(atom); | ||
@@ -505,13 +496,13 @@ } | ||
const subscribeAtom = (atom, listener) => { | ||
const pending = createPending(); | ||
const batch = createBatch(); | ||
const atomState = getAtomState(atom); | ||
const mounted = mountAtom(pending, atom, atomState); | ||
const mounted = mountAtom(batch, atom, atomState); | ||
const listeners = mounted.l; | ||
listeners.add(listener); | ||
flushPending(pending); | ||
flushBatch(batch); | ||
return () => { | ||
listeners.delete(listener); | ||
const pending2 = createPending(); | ||
unmountAtom(pending2, atom, atomState); | ||
flushPending(pending2); | ||
const batch2 = createBatch(); | ||
unmountAtom(batch2, atom, atomState); | ||
flushBatch(batch2); | ||
}; | ||
@@ -526,35 +517,79 @@ }; | ||
}; | ||
{ | ||
const devStore = { | ||
// store dev methods (these are tentative and subject to change without notice) | ||
dev4_get_internal_weak_map: () => ({ | ||
get: (atom) => { | ||
const atomState = getAtomState(atom); | ||
if (atomState.n === 0) { | ||
return void 0; | ||
return store; | ||
}; | ||
const deriveDevStoreRev4 = (store) => { | ||
const proxyAtomStateMap = /* @__PURE__ */ new WeakMap(); | ||
const debugMountedAtoms = /* @__PURE__ */ new Set(); | ||
let savedGetAtomState; | ||
let inRestoreAtom = 0; | ||
const derivedStore = store.unstable_derive( | ||
(getAtomState, atomRead, atomWrite, atomOnMount) => { | ||
savedGetAtomState = getAtomState; | ||
return [ | ||
(atom) => { | ||
let proxyAtomState = proxyAtomStateMap.get(atom); | ||
if (!proxyAtomState) { | ||
const atomState = getAtomState(atom); | ||
proxyAtomState = new Proxy(atomState, { | ||
set(target, prop, value) { | ||
if (prop === "m") { | ||
debugMountedAtoms.add(atom); | ||
} | ||
return Reflect.set(target, prop, value); | ||
}, | ||
deleteProperty(target, prop) { | ||
if (prop === "m") { | ||
debugMountedAtoms.delete(atom); | ||
} | ||
return Reflect.deleteProperty(target, prop); | ||
} | ||
}); | ||
proxyAtomStateMap.set(atom, proxyAtomState); | ||
} | ||
return atomState; | ||
return proxyAtomState; | ||
}, | ||
atomRead, | ||
(atom, getter, setter, ...args) => { | ||
if (inRestoreAtom) { | ||
return setter(atom, ...args); | ||
} | ||
return atomWrite(atom, getter, setter, ...args); | ||
}, | ||
atomOnMount | ||
]; | ||
} | ||
); | ||
const savedStoreSet = derivedStore.set; | ||
const devStore = { | ||
// store dev methods (these are tentative and subject to change without notice) | ||
dev4_get_internal_weak_map: () => ({ | ||
get: (atom) => { | ||
const atomState = savedGetAtomState(atom); | ||
if (atomState.n === 0) { | ||
return void 0; | ||
} | ||
}), | ||
dev4_get_mounted_atoms: () => debugMountedAtoms, | ||
dev4_restore_atoms: (values) => { | ||
const pending = createPending(); | ||
for (const [atom, value] of values) { | ||
if (hasInitialValue(atom)) { | ||
const atomState = getAtomState(atom); | ||
const prevEpochNumber = atomState.n; | ||
setAtomStateValueOrPromise(atom, atomState, value); | ||
mountDependencies(pending, atom, atomState); | ||
if (prevEpochNumber !== atomState.n) { | ||
addPendingAtom(pending, atom, atomState); | ||
recomputeDependents(pending, atom, atomState); | ||
return atomState; | ||
} | ||
}), | ||
dev4_get_mounted_atoms: () => debugMountedAtoms, | ||
dev4_restore_atoms: (values) => { | ||
const restoreAtom = { | ||
read: () => null, | ||
write: (_get, set) => { | ||
++inRestoreAtom; | ||
try { | ||
for (const [atom, value] of values) { | ||
if (hasInitialValue(atom)) { | ||
set(atom, value); | ||
} | ||
} | ||
} finally { | ||
--inRestoreAtom; | ||
} | ||
} | ||
flushPending(pending); | ||
} | ||
}; | ||
Object.assign(store, devStore); | ||
} | ||
return store; | ||
}; | ||
savedStoreSet(restoreAtom); | ||
} | ||
}; | ||
return Object.assign(derivedStore, devStore); | ||
}; | ||
@@ -574,3 +609,3 @@ const createStore = exports("createStore", () => { | ||
}; | ||
return buildStore( | ||
const store = buildStore( | ||
getAtomState, | ||
@@ -584,2 +619,5 @@ (atom, ...params) => atom.read(...params), | ||
); | ||
{ | ||
return deriveDevStoreRev4(store); | ||
} | ||
}); | ||
@@ -586,0 +624,0 @@ let defaultStore; |
@@ -1,1 +0,1 @@ | ||
System.register([],function(z){"use strict";return{execute:function(){z("atom",R);let P=0;function R(t,r){const o=`atom${++P}`,d={toString(){return o}};return typeof t=="function"?d.read=t:(d.init=t,d.read=T,d.write=U),r&&(d.write=r),d}function T(t){return t(this)}function U(t,r,o){return r(this,typeof o=="function"?o(t(this)):o)}const q=(t,r)=>t.unstable_is?t.unstable_is(r):r===t,B=t=>"init"in t,F=t=>!!t.write,b=new WeakMap,A=t=>{var r;return C(t)&&!((r=b.get(t))!=null&&r[1])},V=(t,r)=>{const o=b.get(t);o&&(o[1]=!0,o[0].forEach(d=>d(r)))},$=t=>{if(b.has(t))return;const r=[new Set,!1];b.set(t,r);const o=()=>{r[1]=!0};t.then(o,o),t.onCancel=d=>{r[0].add(d)}},C=t=>typeof(t==null?void 0:t.then)=="function",G=t=>"v"in t||"e"in t,k=t=>{if("e"in t)throw t.e;return t.v},H=(t,r,o)=>{o.p.has(t)||(o.p.add(t),r.then(()=>{o.p.delete(t)},()=>{o.p.delete(t)}))},I=(t,r,o,d,v)=>{var m;o.d.set(d,v.n),A(o.v)&&H(r,o.v,v),(m=v.m)==null||m.t.add(r),t&&x(t,d,r)},g=()=>[new Map,new Map,new Set],J=(t,r,o)=>{t[0].has(r)||t[0].set(r,new Set),t[1].set(r,o)},x=(t,r,o)=>{const d=t[0].get(r);d&&d.add(o)},Q=(t,r)=>t[0].get(r),K=(t,r)=>{t[2].add(r)},p=t=>{let r,o=!1;const d=v=>{try{v()}catch(m){o||(r=m,o=!0)}};for(;t[1].size||t[2].size;){t[0].clear();const v=new Set(t[1].values());t[1].clear();const m=new Set(t[2]);t[2].clear(),v.forEach(D=>{var E;return(E=D.m)==null?void 0:E.l.forEach(d)}),m.forEach(d)}if(o)throw r},L=(...[t,r,o,d])=>{const v=(c,e,n)=>{const u="v"in e,l=e.v,i=A(e.v)?e.v:null;if(C(n)){$(n);for(const s of e.d.keys())H(c,n,t(s));e.v=n,delete e.e}else e.v=n,delete e.e;(!u||!Object.is(l,e.v))&&(++e.n,i&&V(i,n))},m=(c,e,n)=>{var u;const l=t(e);if(G(l)&&(l.m&&!(n!=null&&n.has(e))||Array.from(l.d).every(([f,y])=>m(c,f,n).n===y)))return l;l.d.clear();let i=!0;const s=f=>{if(q(e,f)){const S=t(f);if(!G(S))if(B(f))v(f,S,f.init);else throw new Error("no atom init");return k(S)}const y=m(c,f,n);try{return k(y)}finally{if(i)I(c,e,l,f,y);else{const S=g();I(S,e,l,f,y),M(S,e,l),p(S)}}};let a,h;const w={get signal(){return a||(a=new AbortController),a.signal},get setSelf(){return!h&&F(e)&&(h=(...f)=>{if(!i)return N(e,...f)}),h}};try{const f=r(e,s,w);if(v(e,l,f),C(f)){(u=f.onCancel)==null||u.call(f,()=>a==null?void 0:a.abort());const y=()=>{if(l.m){const S=g();M(S,e,l),p(S)}};f.then(y,y)}return l}catch(f){return delete l.v,l.e=f,++l.n,l}finally{i=!1}},D=c=>k(m(void 0,c)),E=(c,e,n)=>{var u,l;const i=new Map;for(const s of((u=n.m)==null?void 0:u.t)||[]){const a=t(s);a.m&&i.set(s,a)}for(const s of n.p)i.set(s,t(s));return(l=Q(c,e))==null||l.forEach(s=>{i.set(s,t(s))}),i};function Y(c,e,n){const u=[],l=new Set,i=new Set,s=[[e,n]];for(;s.length>0;){const[a,h]=s[s.length-1];if(i.has(a)){s.pop();continue}if(l.has(a)){u.push([a,h,h.n]),i.add(a),s.pop();continue}l.add(a);for(const[w,f]of E(c,a,h))a!==w&&!l.has(w)&&s.push([w,f])}return[u,i]}const Z=(c,e,n)=>{const[u,l]=Y(c,e,n),i=new Set([e]);for(let s=u.length-1;s>=0;--s){const[a,h,w]=u[s];let f=!1;for(const y of h.d.keys())if(y!==a&&i.has(y)){f=!0;break}f&&(m(c,a,l),M(c,a,h),w!==h.n&&(J(c,a,h),i.add(a))),l.delete(a)}},W=(c,e,...n)=>{let u=!0;const l=s=>k(m(c,s)),i=(s,...a)=>{const h=t(s);try{if(q(e,s)){if(!B(s))throw new Error("atom not writable");const w=h.n,f=a[0];v(s,h,f),M(c,s,h),w!==h.n&&(J(c,s,h),Z(c,s,h));return}else return W(c,s,...a)}finally{u||p(c)}};try{return o(e,l,i,...n)}finally{u=!1}},N=(c,...e)=>{const n=g();try{return W(n,c,...e)}finally{p(n)}},M=(c,e,n)=>{if(n.m&&!A(n.v)){for(const u of n.d.keys())n.m.d.has(u)||(j(c,u,t(u)).t.add(e),n.m.d.add(u));for(const u of n.m.d||[])if(!n.d.has(u)){n.m.d.delete(u);const l=O(c,u,t(u));l==null||l.t.delete(e)}}},j=(c,e,n)=>{if(!n.m){m(c,e);for(const u of n.d.keys())j(c,u,t(u)).t.add(e);if(n.m={l:new Set,d:new Set(n.d.keys()),t:new Set},F(e)){const u=n.m;let l;const i=(s,a)=>{let h=!0;l=(...w)=>{try{return W(s,e,...w)}finally{h||p(s)}};try{return a()}finally{h=!1}};K(c,()=>{const s=i(c,()=>d(e,(...a)=>l(...a)));s&&(u.u=a=>i(a,s))})}}return n.m},O=(c,e,n)=>{if(n.m&&!n.m.l.size&&!Array.from(n.m.t).some(u=>{var l;return(l=t(u).m)==null?void 0:l.d.has(e)})){const u=n.m.u;u&&K(c,()=>u(c)),delete n.m;for(const l of n.d.keys()){const i=O(c,l,t(l));i==null||i.t.delete(e)}return}return n.m};return{get:D,set:N,sub:(c,e)=>{const n=g(),u=t(c),l=j(n,c,u).l;return l.add(e),p(n),()=>{l.delete(e);const i=g();O(i,c,u),p(i)}},unstable_derive:c=>L(...c(t,r,o,d))}},X=z("createStore",()=>{const t=new WeakMap;return L(r=>{let o=t.get(r);return o||(o={d:new Map,p:new Set,n:0},t.set(r,o)),o},(r,...o)=>r.read(...o),(r,...o)=>r.write(...o),(r,...o)=>{var d;return(d=r.onMount)==null?void 0:d.call(r,...o)})});let _;const tt=z("getDefaultStore",()=>(_||(_=X()),_))}}}); | ||
System.register([],function(D){"use strict";return{execute:function(){D("atom",N);let K=0;function N(t,n){const o=`atom${++K}`,i={toString(){return o}};return typeof t=="function"?i.read=t:(i.init=t,i.read=P,i.write=Q),n&&(i.write=n),i}function P(t){return t(this)}function Q(t,n,o){return n(this,typeof o=="function"?o(t(this)):o)}const _=(t,n)=>t.unstable_is?t.unstable_is(n):n===t,A=t=>"init"in t,W=t=>!!t.write,M=new WeakMap,E=t=>{var n;return L(t)&&!((n=M.get(t))!=null&&n[1])},T=(t,n)=>{const o=M.get(t);o&&(o[1]=!0,o[0].forEach(i=>i(n)))},U=t=>{if(M.has(t))return;const n=[new Set,!1];M.set(t,n);const o=()=>{n[1]=!0};t.then(o,o),t.onCancel=i=>{n[0].add(i)}},L=t=>typeof(t==null?void 0:t.then)=="function",j=t=>"v"in t||"e"in t,b=t=>{if("e"in t)throw t.e;return t.v},O=(t,n,o)=>{o.p.has(t)||(o.p.add(t),n.then(()=>{o.p.delete(t)},()=>{o.p.delete(t)}))},q=(t,n,o,i,w)=>{var v;o.d.set(i,w.n),E(o.v)&&O(n,o.v,w),(v=w.m)==null||v.t.add(n),t&&V(t,i,n)},p=()=>({D:new Map,H:new Set,M:new Set,L:new Set}),g=(t,n,o)=>{t[n].add(o)},B=(t,n,o)=>{t.D.has(n)||(t.D.set(n,new Set),g(t,"M",()=>{var i;(i=o.m)==null||i.l.forEach(w=>g(t,"M",w))}))},V=(t,n,o)=>{const i=t.D.get(n);i&&i.add(o)},X=(t,n)=>t.D.get(n),S=t=>{let n,o=!1;const i=w=>{try{w()}catch(v){o||(n=v,o=!0)}};for(;t.H.size||t.M.size||t.L.size;)t.D.clear(),t.H.forEach(i),t.H.clear(),t.M.forEach(i),t.M.clear(),t.L.forEach(i),t.L.clear();if(o)throw n},F=(...[t,n,o,i])=>{const w=(l,r,s)=>{const e="v"in r,f=r.v,u=E(r.v)?r.v:null;if(L(s)){U(s);for(const c of r.d.keys())O(l,s,t(c));r.v=s}else r.v=s;delete r.e,delete r.x,(!e||!Object.is(f,r.v))&&(++r.n,u&&T(u,s))},v=(l,r)=>{var s;const e=t(r);if(j(e)&&(e.m&&!e.x||Array.from(e.d).every(([a,h])=>v(l,a).n===h)))return e;e.d.clear();let f=!0;const u=a=>{if(_(r,a)){const y=t(a);if(!j(y))if(A(a))w(a,y,a.init);else throw new Error("no atom init");return b(y)}const h=v(l,a);try{return b(h)}finally{if(f)q(l,r,e,a,h);else{const y=p();q(y,r,e,a,h),k(y,r,e),S(y)}}};let c,d;const m={get signal(){return c||(c=new AbortController),c.signal},get setSelf(){return!d&&W(r)&&(d=(...a)=>{if(!f)return G(r,...a)}),d}};try{const a=n(r,u,m);if(w(r,e,a),L(a)){(s=a.onCancel)==null||s.call(a,()=>c==null?void 0:c.abort());const h=()=>{if(e.m){const y=p();k(y,r,e),S(y)}};a.then(h,h)}return e}catch(a){return delete e.v,e.e=a,delete e.x,++e.n,e}finally{f=!1}},R=l=>b(v(void 0,l)),Y=(l,r,s)=>{var e,f;const u=new Map;for(const c of((e=s.m)==null?void 0:e.t)||[]){const d=t(c);d.m&&u.set(c,d)}for(const c of s.p)u.set(c,t(c));return(f=X(l,r))==null||f.forEach(c=>{u.set(c,t(c))}),u},Z=(l,r,s)=>{const e=[],f=new Set,u=new Set,c=[[r,s]];for(;c.length>0;){const[d,m]=c[c.length-1];if(u.has(d)){c.pop();continue}if(f.has(d)){e.push([d,m,m.n]),u.add(d),m.x=!0,c.pop();continue}f.add(d);for(const[a,h]of Y(l,d,m))d!==a&&!f.has(a)&&c.push([a,h])}g(l,"H",()=>{const d=new Set([r]);for(let m=e.length-1;m>=0;--m){const[a,h,y]=e[m];let I=!1;for(const J of h.d.keys())if(J!==a&&d.has(J)){I=!0;break}I&&(v(l,a),k(l,a,h),y!==h.n&&(B(l,a,h),d.add(a))),delete h.x}})},x=(l,r,...s)=>{let e=!0;const f=c=>b(v(l,c)),u=(c,...d)=>{const m=t(c);try{if(_(r,c)){if(!A(c))throw new Error("atom not writable");const a=m.n,h=d[0];w(c,m,h),k(l,c,m),a!==m.n&&(B(l,c,m),Z(l,c,m));return}else return x(l,c,...d)}finally{e||S(l)}};try{return o(r,f,u,...s)}finally{e=!1}},G=(l,...r)=>{const s=p();try{return x(s,l,...r)}finally{S(s)}},k=(l,r,s)=>{if(s.m&&!E(s.v)){for(const e of s.d.keys())s.m.d.has(e)||(z(l,e,t(e)).t.add(r),s.m.d.add(e));for(const e of s.m.d||[])if(!s.d.has(e)){s.m.d.delete(e);const f=C(l,e,t(e));f==null||f.t.delete(r)}}},z=(l,r,s)=>{if(!s.m){v(l,r);for(const e of s.d.keys())z(l,e,t(e)).t.add(r);if(s.m={l:new Set,d:new Set(s.d.keys()),t:new Set},W(r)){const e=s.m;let f;const u=(c,d)=>{let m=!0;f=(...a)=>{try{return x(c,r,...a)}finally{m||S(c)}};try{return d()}finally{m=!1}};g(l,"L",()=>{const c=u(l,()=>i(r,(...d)=>f(...d)));c&&(e.u=d=>u(d,c))})}}return s.m},C=(l,r,s)=>{if(s.m&&!s.m.l.size&&!Array.from(s.m.t).some(e=>{var f;return(f=t(e).m)==null?void 0:f.d.has(r)})){const e=s.m.u;e&&g(l,"L",()=>e(l)),delete s.m;for(const f of s.d.keys()){const u=C(l,f,t(f));u==null||u.t.delete(r)}return}return s.m};return{get:R,set:G,sub:(l,r)=>{const s=p(),e=t(l),f=z(s,l,e).l;return f.add(r),S(s),()=>{f.delete(r);const u=p();C(u,l,e),S(u)}},unstable_derive:l=>F(...l(t,n,o,i))}},$=D("createStore",()=>{const t=new WeakMap;return F(n=>{let o=t.get(n);return o||(o={d:new Map,p:new Set,n:0},t.set(n,o)),o},(n,...o)=>n.read(...o),(n,...o)=>n.write(...o),(n,...o)=>{var i;return(i=n.onMount)==null?void 0:i.call(n,...o)})});let H;const tt=D("getDefaultStore",()=>(H||(H=$()),H))}}}); |
@@ -21,3 +21,3 @@ import type { Atom, WritableAtom } from './atom'; | ||
/** Function to run when the atom is unmounted. */ | ||
u?: (pending: Pending) => void; | ||
u?: (batch: Batch) => void; | ||
}; | ||
@@ -48,8 +48,15 @@ /** | ||
e?: AnyError; | ||
/** Indicates that the atom value has been changed */ | ||
x?: true; | ||
}; | ||
type Pending = readonly [ | ||
/*dependents*/ Map<AnyAtom, Set<AnyAtom>>, | ||
/*atomStates*/ Map<AnyAtom, AtomState>, | ||
/*functions*/ Set<() => void> | ||
]; | ||
type Batch = Readonly<{ | ||
/** Atom dependents map */ | ||
D: Map<AnyAtom, Set<AnyAtom>>; | ||
/** High priority functions */ | ||
H: Set<() => void>; | ||
/** Medium priority functions */ | ||
M: Set<() => void>; | ||
/** Low priority functions */ | ||
L: Set<() => void>; | ||
}>; | ||
type StoreArgs = readonly [ | ||
@@ -71,3 +78,3 @@ /*getAtomState*/ <Value>(atom: Atom<Value>) => AtomState<Value>, | ||
}; | ||
type PrdStore = { | ||
type Store = { | ||
get: <Value>(atom: Atom<Value>) => Value; | ||
@@ -78,8 +85,8 @@ set: <Value, Args extends unknown[], Result>(atom: WritableAtom<Value, Args, Result>, ...args: Args) => Result; | ||
}; | ||
type Store = PrdStore | (PrdStore & DevStoreRev4); | ||
export type INTERNAL_DevStoreRev4 = DevStoreRev4; | ||
export type INTERNAL_PrdStore = PrdStore; | ||
export declare const createStore: () => Store; | ||
export declare const getDefaultStore: () => Store; | ||
export type INTERNAL_PrdStore = Store; | ||
type PrdOrDevStore = Store | (Store & DevStoreRev4); | ||
export declare const createStore: () => PrdOrDevStore; | ||
export declare const getDefaultStore: () => PrdOrDevStore; | ||
export {}; | ||
declare type Awaited<T> = T extends Promise<infer V> ? V : T; |
@@ -21,3 +21,3 @@ import type { Atom, WritableAtom } from './atom'; | ||
/** Function to run when the atom is unmounted. */ | ||
u?: (pending: Pending) => void; | ||
u?: (batch: Batch) => void; | ||
}; | ||
@@ -48,8 +48,15 @@ /** | ||
e?: AnyError; | ||
/** Indicates that the atom value has been changed */ | ||
x?: true; | ||
}; | ||
type Pending = readonly [ | ||
/*dependents*/ Map<AnyAtom, Set<AnyAtom>>, | ||
/*atomStates*/ Map<AnyAtom, AtomState>, | ||
/*functions*/ Set<() => void> | ||
]; | ||
type Batch = Readonly<{ | ||
/** Atom dependents map */ | ||
D: Map<AnyAtom, Set<AnyAtom>>; | ||
/** High priority functions */ | ||
H: Set<() => void>; | ||
/** Medium priority functions */ | ||
M: Set<() => void>; | ||
/** Low priority functions */ | ||
L: Set<() => void>; | ||
}>; | ||
type StoreArgs = readonly [ | ||
@@ -71,3 +78,3 @@ /*getAtomState*/ <Value>(atom: Atom<Value>) => AtomState<Value>, | ||
}; | ||
type PrdStore = { | ||
type Store = { | ||
get: <Value>(atom: Atom<Value>) => Value; | ||
@@ -78,8 +85,8 @@ set: <Value, Args extends unknown[], Result>(atom: WritableAtom<Value, Args, Result>, ...args: Args) => Result; | ||
}; | ||
type Store = PrdStore | (PrdStore & DevStoreRev4); | ||
export type INTERNAL_DevStoreRev4 = DevStoreRev4; | ||
export type INTERNAL_PrdStore = PrdStore; | ||
export declare const createStore: () => Store; | ||
export declare const getDefaultStore: () => Store; | ||
export type INTERNAL_PrdStore = Store; | ||
type PrdOrDevStore = Store | (Store & DevStoreRev4); | ||
export declare const createStore: () => PrdOrDevStore; | ||
export declare const getDefaultStore: () => PrdOrDevStore; | ||
export {}; | ||
declare type Awaited<T> = T extends Promise<infer V> ? V : T; |
@@ -128,3 +128,3 @@ (function (global, factory) { | ||
}; | ||
var addDependency = function addDependency(pending, atom, atomState, a, aState) { | ||
var addDependency = function addDependency(batch, atom, atomState, a, aState) { | ||
var _aState$m; | ||
@@ -139,17 +139,30 @@ if (a === atom) { | ||
(_aState$m = aState.m) == null || _aState$m.t.add(atom); | ||
if (pending) { | ||
addPendingDependent(pending, a, atom); | ||
if (batch) { | ||
addBatchAtomDependent(batch, a, atom); | ||
} | ||
}; | ||
var createPending = function createPending() { | ||
return [new Map(), new Map(), new Set()]; | ||
var createBatch = function createBatch() { | ||
return { | ||
D: new Map(), | ||
H: new Set(), | ||
M: new Set(), | ||
L: new Set() | ||
}; | ||
}; | ||
var addPendingAtom = function addPendingAtom(pending, atom, atomState) { | ||
if (!pending[0].has(atom)) { | ||
pending[0].set(atom, new Set()); | ||
var addBatchFunc = function addBatchFunc(batch, priority, fn) { | ||
batch[priority].add(fn); | ||
}; | ||
var registerBatchAtom = function registerBatchAtom(batch, atom, atomState) { | ||
if (!batch.D.has(atom)) { | ||
batch.D.set(atom, new Set()); | ||
addBatchFunc(batch, 'M', function () { | ||
var _atomState$m; | ||
(_atomState$m = atomState.m) == null || _atomState$m.l.forEach(function (listener) { | ||
return addBatchFunc(batch, 'M', listener); | ||
}); | ||
}); | ||
} | ||
pending[1].set(atom, atomState); | ||
}; | ||
var addPendingDependent = function addPendingDependent(pending, atom, dependent) { | ||
var dependents = pending[0].get(atom); | ||
var addBatchAtomDependent = function addBatchAtomDependent(batch, atom, dependent) { | ||
var dependents = batch.D.get(atom); | ||
if (dependents) { | ||
@@ -159,9 +172,6 @@ dependents.add(dependent); | ||
}; | ||
var getPendingDependents = function getPendingDependents(pending, atom) { | ||
return pending[0].get(atom); | ||
var getBatchAtomDependents = function getBatchAtomDependents(batch, atom) { | ||
return batch.D.get(atom); | ||
}; | ||
var addPendingFunction = function addPendingFunction(pending, fn) { | ||
pending[2].add(fn); | ||
}; | ||
var flushPending = function flushPending(pending) { | ||
var flushBatch = function flushBatch(batch) { | ||
var error; | ||
@@ -179,13 +189,10 @@ var hasError = false; | ||
}; | ||
while (pending[1].size || pending[2].size) { | ||
pending[0].clear(); | ||
var _atomStates = new Set(pending[1].values()); | ||
pending[1].clear(); | ||
var _functions = new Set(pending[2]); | ||
pending[2].clear(); | ||
_atomStates.forEach(function (atomState) { | ||
var _atomState$m; | ||
return (_atomState$m = atomState.m) == null ? void 0 : _atomState$m.l.forEach(call); | ||
}); | ||
_functions.forEach(call); | ||
while (batch.H.size || batch.M.size || batch.L.size) { | ||
batch.D.clear(); | ||
batch.H.forEach(call); | ||
batch.H.clear(); | ||
batch.M.forEach(call); | ||
batch.M.clear(); | ||
batch.L.forEach(call); | ||
batch.L.clear(); | ||
} | ||
@@ -204,6 +211,2 @@ if (hasError) { | ||
atomOnMount = _ref[3]; | ||
var debugMountedAtoms; | ||
{ | ||
debugMountedAtoms = new Set(); | ||
} | ||
var setAtomStateValueOrPromise = function setAtomStateValueOrPromise(atom, atomState, valueOrPromise) { | ||
@@ -220,7 +223,7 @@ var hasPrevValue = 'v' in atomState; | ||
atomState.v = valueOrPromise; | ||
delete atomState.e; | ||
} else { | ||
atomState.v = valueOrPromise; | ||
delete atomState.e; | ||
} | ||
delete atomState.e; | ||
delete atomState.x; | ||
if (!hasPrevValue || !Object.is(prevValue, atomState.v)) { | ||
@@ -233,6 +236,6 @@ ++atomState.n; | ||
}; | ||
var _readAtomState = function readAtomState(pending, atom, dirtyAtoms) { | ||
var _readAtomState = function readAtomState(batch, atom) { | ||
var atomState = getAtomState(atom); | ||
if (isAtomStateInitialized(atomState)) { | ||
if (atomState.m && !(dirtyAtoms != null && dirtyAtoms.has(atom))) { | ||
if (atomState.m && !atomState.x) { | ||
return atomState; | ||
@@ -243,3 +246,3 @@ } | ||
n = _ref2[1]; | ||
return (_readAtomState(pending, a, dirtyAtoms).n === n | ||
return (_readAtomState(batch, a).n === n | ||
); | ||
@@ -264,3 +267,3 @@ })) { | ||
} | ||
var aState = _readAtomState(pending, a, dirtyAtoms); | ||
var aState = _readAtomState(batch, a); | ||
try { | ||
@@ -270,8 +273,8 @@ return returnAtomValue(aState); | ||
if (isSync) { | ||
addDependency(pending, atom, atomState, a, aState); | ||
addDependency(batch, atom, atomState, a, aState); | ||
} else { | ||
var _pending = createPending(); | ||
addDependency(_pending, atom, atomState, a, aState); | ||
mountDependencies(_pending, atom, atomState); | ||
flushPending(_pending); | ||
var _batch = createBatch(); | ||
addDependency(_batch, atom, atomState, a, aState); | ||
mountDependencies(_batch, atom, atomState); | ||
flushBatch(_batch); | ||
} | ||
@@ -319,5 +322,5 @@ } | ||
if (atomState.m) { | ||
var _pending2 = createPending(); | ||
mountDependencies(_pending2, atom, atomState); | ||
flushPending(_pending2); | ||
var _batch2 = createBatch(); | ||
mountDependencies(_batch2, atom, atomState); | ||
flushBatch(_batch2); | ||
} | ||
@@ -331,2 +334,3 @@ }; | ||
atomState.e = error; | ||
delete atomState.x; | ||
++atomState.n; | ||
@@ -341,4 +345,4 @@ return atomState; | ||
}; | ||
var getMountedOrPendingDependents = function getMountedOrPendingDependents(pending, atom, atomState) { | ||
var _getPendingDependents; | ||
var getMountedOrBatchDependents = function getMountedOrBatchDependents(batch, atom, atomState) { | ||
var _getBatchAtomDependen; | ||
var dependents = new Map(); | ||
@@ -357,3 +361,3 @@ for (var _iterator2 = _createForOfIteratorHelperLoose(((_atomState$m2 = atomState.m) == null ? void 0 : _atomState$m2.t) || []), _step2; !(_step2 = _iterator2()).done;) { | ||
} | ||
(_getPendingDependents = getPendingDependents(pending, atom)) == null || _getPendingDependents.forEach(function (dependent) { | ||
(_getBatchAtomDependen = getBatchAtomDependents(batch, atom)) == null || _getBatchAtomDependen.forEach(function (dependent) { | ||
dependents.set(dependent, getAtomState(dependent)); | ||
@@ -363,7 +367,7 @@ }); | ||
}; | ||
function getSortedDependents(pending, rootAtom, rootAtomState) { | ||
var sorted = []; | ||
var recomputeDependents = function recomputeDependents(batch, atom, atomState) { | ||
var topSortedReversed = []; | ||
var visiting = new Set(); | ||
var visited = new Set(); | ||
var stack = [[rootAtom, rootAtomState]]; | ||
var stack = [[atom, atomState]]; | ||
while (stack.length > 0) { | ||
@@ -378,4 +382,5 @@ var _ref3 = stack[stack.length - 1], | ||
if (visiting.has(a)) { | ||
sorted.push([a, aState, aState.n]); | ||
topSortedReversed.push([a, aState, aState.n]); | ||
visited.add(a); | ||
aState.x = true; | ||
stack.pop(); | ||
@@ -385,3 +390,3 @@ continue; | ||
visiting.add(a); | ||
for (var _iterator4 = _createForOfIteratorHelperLoose(getMountedOrPendingDependents(pending, a, aState)), _step4; !(_step4 = _iterator4()).done;) { | ||
for (var _iterator4 = _createForOfIteratorHelperLoose(getMountedOrBatchDependents(batch, a, aState)), _step4; !(_step4 = _iterator4()).done;) { | ||
var _step4$value = _step4.value, | ||
@@ -395,37 +400,33 @@ d = _step4$value[0], | ||
} | ||
return [sorted, visited]; | ||
} | ||
var recomputeDependents = function recomputeDependents(pending, atom, atomState) { | ||
var _getSortedDependents = getSortedDependents(pending, atom, atomState), | ||
topsortedAtoms = _getSortedDependents[0], | ||
markedAtoms = _getSortedDependents[1]; | ||
var changedAtoms = new Set([atom]); | ||
for (var i = topsortedAtoms.length - 1; i >= 0; --i) { | ||
var _ref4 = topsortedAtoms[i], | ||
a = _ref4[0], | ||
aState = _ref4[1], | ||
prevEpochNumber = _ref4[2]; | ||
var hasChangedDeps = false; | ||
for (var _iterator5 = _createForOfIteratorHelperLoose(aState.d.keys()), _step5; !(_step5 = _iterator5()).done;) { | ||
var dep = _step5.value; | ||
if (dep !== a && changedAtoms.has(dep)) { | ||
hasChangedDeps = true; | ||
break; | ||
addBatchFunc(batch, 'H', function () { | ||
var changedAtoms = new Set([atom]); | ||
for (var i = topSortedReversed.length - 1; i >= 0; --i) { | ||
var _ref4 = topSortedReversed[i], | ||
_a = _ref4[0], | ||
_aState2 = _ref4[1], | ||
prevEpochNumber = _ref4[2]; | ||
var hasChangedDeps = false; | ||
for (var _iterator5 = _createForOfIteratorHelperLoose(_aState2.d.keys()), _step5; !(_step5 = _iterator5()).done;) { | ||
var dep = _step5.value; | ||
if (dep !== _a && changedAtoms.has(dep)) { | ||
hasChangedDeps = true; | ||
break; | ||
} | ||
} | ||
} | ||
if (hasChangedDeps) { | ||
_readAtomState(pending, a, markedAtoms); | ||
mountDependencies(pending, a, aState); | ||
if (prevEpochNumber !== aState.n) { | ||
addPendingAtom(pending, a, aState); | ||
changedAtoms.add(a); | ||
if (hasChangedDeps) { | ||
_readAtomState(batch, _a); | ||
mountDependencies(batch, _a, _aState2); | ||
if (prevEpochNumber !== _aState2.n) { | ||
registerBatchAtom(batch, _a, _aState2); | ||
changedAtoms.add(_a); | ||
} | ||
} | ||
delete _aState2.x; | ||
} | ||
markedAtoms.delete(a); | ||
} | ||
}); | ||
}; | ||
var _writeAtomState = function writeAtomState(pending, atom) { | ||
var _writeAtomState = function writeAtomState(batch, atom) { | ||
var isSync = true; | ||
var getter = function getter(a) { | ||
return returnAtomValue(_readAtomState(pending, a)); | ||
return returnAtomValue(_readAtomState(batch, a)); | ||
}; | ||
@@ -445,14 +446,14 @@ var setter = function setter(a) { | ||
setAtomStateValueOrPromise(a, aState, v); | ||
mountDependencies(pending, a, aState); | ||
mountDependencies(batch, a, aState); | ||
if (prevEpochNumber !== aState.n) { | ||
addPendingAtom(pending, a, aState); | ||
recomputeDependents(pending, a, aState); | ||
registerBatchAtom(batch, a, aState); | ||
recomputeDependents(batch, a, aState); | ||
} | ||
return undefined; | ||
} else { | ||
return _writeAtomState.apply(void 0, [pending, a].concat(args)); | ||
return _writeAtomState.apply(void 0, [batch, a].concat(args)); | ||
} | ||
} finally { | ||
if (!isSync) { | ||
flushPending(pending); | ||
flushBatch(batch); | ||
} | ||
@@ -471,3 +472,3 @@ } | ||
var writeAtom = function writeAtom(atom) { | ||
var pending = createPending(); | ||
var batch = createBatch(); | ||
try { | ||
@@ -477,8 +478,8 @@ for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { | ||
} | ||
return _writeAtomState.apply(void 0, [pending, atom].concat(args)); | ||
return _writeAtomState.apply(void 0, [batch, atom].concat(args)); | ||
} finally { | ||
flushPending(pending); | ||
flushBatch(batch); | ||
} | ||
}; | ||
var mountDependencies = function mountDependencies(pending, atom, atomState) { | ||
var mountDependencies = function mountDependencies(batch, atom, atomState) { | ||
if (atomState.m && !isPendingPromise(atomState.v)) { | ||
@@ -488,3 +489,3 @@ for (var _iterator6 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step6; !(_step6 = _iterator6()).done;) { | ||
if (!atomState.m.d.has(a)) { | ||
var aMounted = _mountAtom(pending, a, getAtomState(a)); | ||
var aMounted = _mountAtom(batch, a, getAtomState(a)); | ||
aMounted.t.add(atom); | ||
@@ -495,6 +496,6 @@ atomState.m.d.add(a); | ||
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, getAtomState(_a)); | ||
var _a2 = _step7.value; | ||
if (!atomState.d.has(_a2)) { | ||
atomState.m.d.delete(_a2); | ||
var _aMounted = _unmountAtom(batch, _a2, getAtomState(_a2)); | ||
_aMounted == null || _aMounted.t.delete(atom); | ||
@@ -505,8 +506,8 @@ } | ||
}; | ||
var _mountAtom = function mountAtom(pending, atom, atomState) { | ||
var _mountAtom = function mountAtom(batch, atom, atomState) { | ||
if (!atomState.m) { | ||
_readAtomState(pending, atom); | ||
_readAtomState(batch, atom); | ||
for (var _iterator8 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step8; !(_step8 = _iterator8()).done;) { | ||
var a = _step8.value; | ||
var aMounted = _mountAtom(pending, a, getAtomState(a)); | ||
var aMounted = _mountAtom(batch, a, getAtomState(a)); | ||
aMounted.t.add(atom); | ||
@@ -519,9 +520,6 @@ } | ||
}; | ||
{ | ||
debugMountedAtoms.add(atom); | ||
} | ||
if (isActuallyWritableAtom(atom)) { | ||
var mounted = atomState.m; | ||
var _setAtom; | ||
var createInvocationContext = function createInvocationContext(pending, fn) { | ||
var createInvocationContext = function createInvocationContext(batch, fn) { | ||
var isSync = true; | ||
@@ -533,6 +531,6 @@ _setAtom = function _setAtom() { | ||
} | ||
return _writeAtomState.apply(void 0, [pending, atom].concat(args)); | ||
return _writeAtomState.apply(void 0, [batch, atom].concat(args)); | ||
} finally { | ||
if (!isSync) { | ||
flushPending(pending); | ||
flushBatch(batch); | ||
} | ||
@@ -547,4 +545,4 @@ } | ||
}; | ||
addPendingFunction(pending, function () { | ||
var onUnmount = createInvocationContext(pending, function () { | ||
addBatchFunc(batch, 'L', function () { | ||
var onUnmount = createInvocationContext(batch, function () { | ||
return atomOnMount(atom, function () { | ||
@@ -555,4 +553,4 @@ return _setAtom.apply(void 0, arguments); | ||
if (onUnmount) { | ||
mounted.u = function (pending) { | ||
return createInvocationContext(pending, onUnmount); | ||
mounted.u = function (batch) { | ||
return createInvocationContext(batch, onUnmount); | ||
}; | ||
@@ -565,3 +563,3 @@ } | ||
}; | ||
var _unmountAtom = function unmountAtom(pending, atom, atomState) { | ||
var _unmountAtom = function unmountAtom(batch, atom, atomState) { | ||
if (atomState.m && !atomState.m.l.size && !Array.from(atomState.m.t).some(function (a) { | ||
@@ -573,13 +571,10 @@ var _getAtomState$m; | ||
if (onUnmount) { | ||
addPendingFunction(pending, function () { | ||
return onUnmount(pending); | ||
addBatchFunc(batch, 'L', function () { | ||
return onUnmount(batch); | ||
}); | ||
} | ||
delete atomState.m; | ||
{ | ||
debugMountedAtoms.delete(atom); | ||
} | ||
for (var _iterator9 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step9; !(_step9 = _iterator9()).done;) { | ||
var a = _step9.value; | ||
var aMounted = _unmountAtom(pending, a, getAtomState(a)); | ||
var aMounted = _unmountAtom(batch, a, getAtomState(a)); | ||
aMounted == null || aMounted.t.delete(atom); | ||
@@ -592,13 +587,13 @@ } | ||
var subscribeAtom = function subscribeAtom(atom, listener) { | ||
var pending = createPending(); | ||
var batch = createBatch(); | ||
var atomState = getAtomState(atom); | ||
var mounted = _mountAtom(pending, atom, atomState); | ||
var mounted = _mountAtom(batch, atom, atomState); | ||
var listeners = mounted.l; | ||
listeners.add(listener); | ||
flushPending(pending); | ||
flushBatch(batch); | ||
return function () { | ||
listeners.delete(listener); | ||
var pending = createPending(); | ||
_unmountAtom(pending, atom, atomState); | ||
flushPending(pending); | ||
var batch = createBatch(); | ||
_unmountAtom(batch, atom, atomState); | ||
flushBatch(batch); | ||
}; | ||
@@ -615,41 +610,83 @@ }; | ||
}; | ||
{ | ||
var devStore = { | ||
dev4_get_internal_weak_map: function dev4_get_internal_weak_map() { | ||
return { | ||
get: function get(atom) { | ||
var atomState = getAtomState(atom); | ||
if (atomState.n === 0) { | ||
return undefined; | ||
return store; | ||
}; | ||
var deriveDevStoreRev4 = function deriveDevStoreRev4(store) { | ||
var proxyAtomStateMap = new WeakMap(); | ||
var debugMountedAtoms = new Set(); | ||
var savedGetAtomState; | ||
var inRestoreAtom = 0; | ||
var derivedStore = store.unstable_derive(function (getAtomState, atomRead, atomWrite, atomOnMount) { | ||
savedGetAtomState = getAtomState; | ||
return [function (atom) { | ||
var proxyAtomState = proxyAtomStateMap.get(atom); | ||
if (!proxyAtomState) { | ||
var atomState = getAtomState(atom); | ||
proxyAtomState = new Proxy(atomState, { | ||
set: function set(target, prop, value) { | ||
if (prop === 'm') { | ||
debugMountedAtoms.add(atom); | ||
} | ||
return atomState; | ||
return Reflect.set(target, prop, value); | ||
}, | ||
deleteProperty: function deleteProperty(target, prop) { | ||
if (prop === 'm') { | ||
debugMountedAtoms.delete(atom); | ||
} | ||
return Reflect.deleteProperty(target, prop); | ||
} | ||
}; | ||
}, | ||
dev4_get_mounted_atoms: function dev4_get_mounted_atoms() { | ||
return debugMountedAtoms; | ||
}, | ||
dev4_restore_atoms: function dev4_restore_atoms(values) { | ||
var pending = createPending(); | ||
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 prevEpochNumber = atomState.n; | ||
setAtomStateValueOrPromise(_atom, atomState, value); | ||
mountDependencies(pending, _atom, atomState); | ||
if (prevEpochNumber !== atomState.n) { | ||
addPendingAtom(pending, _atom, atomState); | ||
recomputeDependents(pending, _atom, atomState); | ||
}); | ||
proxyAtomStateMap.set(atom, proxyAtomState); | ||
} | ||
return proxyAtomState; | ||
}, atomRead, function (atom, getter, setter) { | ||
for (var _len7 = arguments.length, args = new Array(_len7 > 3 ? _len7 - 3 : 0), _key7 = 3; _key7 < _len7; _key7++) { | ||
args[_key7 - 3] = arguments[_key7]; | ||
} | ||
if (inRestoreAtom) { | ||
return setter.apply(void 0, [atom].concat(args)); | ||
} | ||
return atomWrite.apply(void 0, [atom, getter, setter].concat(args)); | ||
}, atomOnMount]; | ||
}); | ||
var savedStoreSet = derivedStore.set; | ||
var devStore = { | ||
dev4_get_internal_weak_map: function dev4_get_internal_weak_map() { | ||
return { | ||
get: function get(atom) { | ||
var atomState = savedGetAtomState(atom); | ||
if (atomState.n === 0) { | ||
return undefined; | ||
} | ||
return atomState; | ||
} | ||
}; | ||
}, | ||
dev4_get_mounted_atoms: function dev4_get_mounted_atoms() { | ||
return debugMountedAtoms; | ||
}, | ||
dev4_restore_atoms: function dev4_restore_atoms(values) { | ||
var restoreAtom = { | ||
read: function read() { | ||
return null; | ||
}, | ||
write: function write(_get, set) { | ||
++inRestoreAtom; | ||
try { | ||
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)) { | ||
set(_atom, value); | ||
} | ||
} | ||
} finally { | ||
--inRestoreAtom; | ||
} | ||
} | ||
flushPending(pending); | ||
} | ||
}; | ||
Object.assign(store, devStore); | ||
} | ||
return store; | ||
}; | ||
savedStoreSet(restoreAtom); | ||
} | ||
}; | ||
return Object.assign(derivedStore, devStore); | ||
}; | ||
@@ -673,12 +710,7 @@ var createStore = function createStore() { | ||
}; | ||
return _buildStore(getAtomState, function (atom) { | ||
for (var _len7 = arguments.length, params = new Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) { | ||
params[_key7 - 1] = arguments[_key7]; | ||
} | ||
return atom.read.apply(atom, params); | ||
}, function (atom) { | ||
var store = _buildStore(getAtomState, function (atom) { | ||
for (var _len8 = arguments.length, params = new Array(_len8 > 1 ? _len8 - 1 : 0), _key8 = 1; _key8 < _len8; _key8++) { | ||
params[_key8 - 1] = arguments[_key8]; | ||
} | ||
return atom.write.apply(atom, params); | ||
return atom.read.apply(atom, params); | ||
}, function (atom) { | ||
@@ -688,4 +720,12 @@ for (var _len9 = arguments.length, params = new Array(_len9 > 1 ? _len9 - 1 : 0), _key9 = 1; _key9 < _len9; _key9++) { | ||
} | ||
return atom.write.apply(atom, params); | ||
}, function (atom) { | ||
for (var _len10 = arguments.length, params = new Array(_len10 > 1 ? _len10 - 1 : 0), _key10 = 1; _key10 < _len10; _key10++) { | ||
params[_key10 - 1] = arguments[_key10]; | ||
} | ||
return atom.onMount == null ? void 0 : atom.onMount.apply(atom, params); | ||
}); | ||
{ | ||
return deriveDevStoreRev4(store); | ||
} | ||
}; | ||
@@ -692,0 +732,0 @@ var defaultStore; |
@@ -1,1 +0,1 @@ | ||
!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((n="undefined"!=typeof globalThis?globalThis:n||self).jotaiVanilla={})}(this,(function(n){"use strict";var r=0;function e(n){return n(this)}function t(n,r,e){return r(this,"function"==typeof e?e(n(this)):e)}function a(n,r){(null==r||r>n.length)&&(r=n.length);for(var e=0,t=Array(r);e<r;e++)t[e]=n[e];return t}function o(n,r){var e="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(e)return(e=e.call(n)).next.bind(e);if(Array.isArray(n)||(e=function(n,r){if(n){if("string"==typeof n)return a(n,r);var e={}.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?a(n,r):void 0}}(n))||r){e&&(n=e);var t=0;return function(){return t>=n.length?{done:!0}:{done:!1,value:n[t++]}}}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,r){return n.unstable_is?n.unstable_is(r):r===n},f=function(n){return"init"in n},l=function(n){return!!n.write},v=new WeakMap,c=function(n){var r;return d(n)&&!(null!=(r=v.get(n))&&r[1])},d=function(n){return"function"==typeof(null==n?void 0:n.then)},s=function(n){return"v"in n||"e"in n},y=function(n){if("e"in n)throw n.e;return n.v},p=function(n,r,e){e.p.has(n)||(e.p.add(n),r.then((function(){e.p.delete(n)}),(function(){e.p.delete(n)})))},h=function(n,r,e,t,a){var o;e.d.set(t,a.n),c(e.v)&&p(r,e.v,a),null==(o=a.m)||o.t.add(r),n&&g(n,t,r)},m=function(){return[new Map,new Map,new Set]},w=function(n,r,e){n[0].has(r)||n[0].set(r,new Set),n[1].set(r,e)},g=function(n,r,e){var t=n[0].get(r);t&&t.add(e)},b=function(n,r){n[2].add(r)},S=function(n){for(var r,e=!1,t=function(n){try{n()}catch(n){e||(r=n,e=!0)}};n[1].size||n[2].size;){n[0].clear();var a=new Set(n[1].values());n[1].clear();var o=new Set(n[2]);n[2].clear(),a.forEach((function(n){var r;return null==(r=n.m)?void 0:r.l.forEach(t)})),o.forEach(t)}if(e)throw r},A=function(){for(var n=arguments.length,r=new Array(n),e=0;e<n;e++)r[e]=arguments[e];var t=r[0],a=r[1],i=r[2],g=r[3],k=function(n,r,e){var a,i,u,f="v"in r,l=r.v,s=c(r.v)?r.v:null;if(d(e)){!function(n){if(!v.has(n)){var r=[new Set,!1];v.set(n,r);var e=function(){r[1]=!0};n.then(e,e),n.onCancel=function(n){r[0].add(n)}}}(e);for(var y,h=o(r.d.keys());!(y=h()).done;){var m=y.value;p(n,e,t(m))}r.v=e,delete r.e}else r.v=e,delete r.e;f&&Object.is(l,r.v)||(++r.n,s&&(a=s,i=e,(u=v.get(a))&&(u[1]=!0,u[0].forEach((function(n){return n(i)})))))},M=function(n,r,e){var o=t(r);if(s(o)){if(o.m&&(null==e||!e.has(r)))return o;if(Array.from(o.d).every((function(r){var t=r[0],a=r[1];return M(n,t,e).n===a})))return o}o.d.clear();var i,v,c=!0,p={get signal(){return i||(i=new AbortController),i.signal},get setSelf(){return!v&&l(r)&&(v=function(){if(!c){for(var n=arguments.length,e=new Array(n),t=0;t<n;t++)e[t]=arguments[t];return x.apply(void 0,[r].concat(e))}}),v}};try{var w=a(r,(function(a){if(u(r,a)){var i=t(a);if(!s(i)){if(!f(a))throw new Error("no atom init");k(a,i,a.init)}return y(i)}var l=M(n,a,e);try{return y(l)}finally{if(c)h(n,r,o,a,l);else{var v=m();h(v,r,o,a,l),z(v,r,o),S(v)}}}),p);if(k(r,o,w),d(w)){null==w.onCancel||w.onCancel((function(){var n;return null==(n=i)?void 0:n.abort()}));var g=function(){if(o.m){var n=m();z(n,r,o),S(n)}};w.then(g,g)}return o}catch(n){return delete o.v,o.e=n,++o.n,o}finally{c=!1}},E=function(n,r,e){for(var a,i,u=new Map,f=o((null==(l=e.m)?void 0:l.t)||[]);!(i=f()).done;){var l,v=i.value,c=t(v);c.m&&u.set(v,c)}for(var d,s=o(e.p);!(d=s()).done;){var y=d.value;u.set(y,t(y))}return null==(a=function(n,r){return n[0].get(r)}(n,r))||a.forEach((function(n){u.set(n,t(n))})),u};var j=function(n,r,e){for(var t=function(n,r,e){for(var t=[],a=new Set,i=new Set,u=[[r,e]];u.length>0;){var f=u[u.length-1],l=f[0],v=f[1];if(i.has(l))u.pop();else if(a.has(l))t.push([l,v,v.n]),i.add(l),u.pop();else{a.add(l);for(var c,d=o(E(n,l,v));!(c=d()).done;){var s=c.value,y=s[0],p=s[1];l===y||a.has(y)||u.push([y,p])}}}return[t,i]}(n,r,e),a=t[0],i=t[1],u=new Set([r]),f=a.length-1;f>=0;--f){for(var l,v=a[f],c=v[0],d=v[1],s=v[2],y=!1,p=o(d.d.keys());!(l=p()).done;){var h=l.value;if(h!==c&&u.has(h)){y=!0;break}}y&&(M(n,c,i),z(n,c,d),s!==d.n&&(w(n,c,d),u.add(c))),i.delete(c)}},C=function(n,r){var e=!0;try{for(var a=arguments.length,o=new Array(a>2?a-2:0),l=2;l<a;l++)o[l-2]=arguments[l];return i.apply(void 0,[r,function(r){return y(M(n,r))},function(a){var o=t(a);try{for(var i=arguments.length,l=new Array(i>1?i-1:0),v=1;v<i;v++)l[v-1]=arguments[v];if(u(r,a)){if(!f(a))throw new Error("atom not writable");var c=o.n,d=l[0];return k(a,o,d),z(n,a,o),void(c!==o.n&&(w(n,a,o),j(n,a,o)))}return C.apply(void 0,[n,a].concat(l))}finally{e||S(n)}}].concat(o))}finally{e=!1}},x=function(n){var r=m();try{for(var e=arguments.length,t=new Array(e>1?e-1:0),a=1;a<e;a++)t[a-1]=arguments[a];return C.apply(void 0,[r,n].concat(t))}finally{S(r)}},z=function(n,r,e){if(e.m&&!c(e.v)){for(var a,i=o(e.d.keys());!(a=i()).done;){var u=a.value;if(!e.m.d.has(u))I(n,u,t(u)).t.add(r),e.m.d.add(u)}for(var f,l=o(e.m.d||[]);!(f=l()).done;){var v=f.value;if(!e.d.has(v)){e.m.d.delete(v);var d=T(n,v,t(v));null==d||d.t.delete(r)}}}},I=function(n,r,e){if(!e.m){M(n,r);for(var a,i=o(e.d.keys());!(a=i()).done;){var u=a.value;I(n,u,t(u)).t.add(r)}if(e.m={l:new Set,d:new Set(e.d.keys()),t:new Set},l(r)){var f,v=e.m,c=function(n,e){var t=!0;f=function(){try{for(var e=arguments.length,a=new Array(e),o=0;o<e;o++)a[o]=arguments[o];return C.apply(void 0,[n,r].concat(a))}finally{t||S(n)}};try{return e()}finally{t=!1}};b(n,(function(){var e=c(n,(function(){return g(r,(function(){return f.apply(void 0,arguments)}))}));e&&(v.u=function(n){return c(n,e)})}))}}return e.m},T=function(n,r,e){if(!e.m||e.m.l.size||Array.from(e.m.t).some((function(n){var e;return null==(e=t(n).m)?void 0:e.d.has(r)})))return e.m;var a=e.m.u;a&&b(n,(function(){return a(n)})),delete e.m;for(var i,u=o(e.d.keys());!(i=u()).done;){var f=i.value,l=T(n,f,t(f));null==l||l.t.delete(r)}},_={get:function(n){return y(M(void 0,n))},set:x,sub:function(n,r){var e=m(),a=t(n),o=I(e,n,a).l;return o.add(r),S(e),function(){o.delete(r);var e=m();T(e,n,a),S(e)}},unstable_derive:function(n){return A.apply(void 0,n(t,a,i,g))}};return _},k=function(){var n=new WeakMap;return A((function(r){var e=n.get(r);return e||(e={d:new Map,p:new Set,n:0},n.set(r,e)),e}),(function(n){for(var r=arguments.length,e=new Array(r>1?r-1:0),t=1;t<r;t++)e[t-1]=arguments[t];return n.read.apply(n,e)}),(function(n){for(var r=arguments.length,e=new Array(r>1?r-1:0),t=1;t<r;t++)e[t-1]=arguments[t];return n.write.apply(n,e)}),(function(n){for(var r=arguments.length,e=new Array(r>1?r-1:0),t=1;t<r;t++)e[t-1]=arguments[t];return null==n.onMount?void 0:n.onMount.apply(n,e)}))};n.atom=function(n,a){var o="atom"+ ++r,i={toString:function(){return o}};return"function"==typeof n?i.read=n:(i.init=n,i.read=e,i.write=t),a&&(i.write=a),i},n.createStore=k,n.getDefaultStore=function(){return i||(i=k()),i}})); | ||
!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((n="undefined"!=typeof globalThis?globalThis:n||self).jotaiVanilla={})}(this,(function(n){"use strict";var r=0;function e(n){return n(this)}function t(n,r,e){return r(this,"function"==typeof e?e(n(this)):e)}function a(n,r){(null==r||r>n.length)&&(r=n.length);for(var e=0,t=Array(r);e<r;e++)t[e]=n[e];return t}function o(n,r){var e="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(e)return(e=e.call(n)).next.bind(e);if(Array.isArray(n)||(e=function(n,r){if(n){if("string"==typeof n)return a(n,r);var e={}.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?a(n,r):void 0}}(n))||r){e&&(n=e);var t=0;return function(){return t>=n.length?{done:!0}:{done:!1,value:n[t++]}}}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,r){return n.unstable_is?n.unstable_is(r):r===n},f=function(n){return"init"in n},l=function(n){return!!n.write},c=new WeakMap,v=function(n){var r;return d(n)&&!(null!=(r=c.get(n))&&r[1])},d=function(n){return"function"==typeof(null==n?void 0:n.then)},s=function(n){return"v"in n||"e"in n},y=function(n){if("e"in n)throw n.e;return n.v},p=function(n,r,e){e.p.has(n)||(e.p.add(n),r.then((function(){e.p.delete(n)}),(function(){e.p.delete(n)})))},h=function(n,r,e,t,a){var o;e.d.set(t,a.n),v(e.v)&&p(r,e.v,a),null==(o=a.m)||o.t.add(r),n&&b(n,t,r)},m=function(){return{D:new Map,H:new Set,M:new Set,L:new Set}},w=function(n,r,e){n[r].add(e)},g=function(n,r,e){n.D.has(r)||(n.D.set(r,new Set),w(n,"M",(function(){var r;null==(r=e.m)||r.l.forEach((function(r){return w(n,"M",r)}))})))},b=function(n,r,e){var t=n.D.get(r);t&&t.add(e)},S=function(n){for(var r,e=!1,t=function(n){try{n()}catch(n){e||(r=n,e=!0)}};n.H.size||n.M.size||n.L.size;)n.D.clear(),n.H.forEach(t),n.H.clear(),n.M.forEach(t),n.M.clear(),n.L.forEach(t),n.L.clear();if(e)throw r},A=function(){for(var n=arguments.length,r=new Array(n),e=0;e<n;e++)r[e]=arguments[e];var t=r[0],a=r[1],i=r[2],b=r[3],M=function(n,r,e){var a,i,u,f="v"in r,l=r.v,s=v(r.v)?r.v:null;if(d(e)){!function(n){if(!c.has(n)){var r=[new Set,!1];c.set(n,r);var e=function(){r[1]=!0};n.then(e,e),n.onCancel=function(n){r[0].add(n)}}}(e);for(var y,h=o(r.d.keys());!(y=h()).done;){var m=y.value;p(n,e,t(m))}r.v=e}else r.v=e;delete r.e,delete r.x,f&&Object.is(l,r.v)||(++r.n,s&&(a=s,i=e,(u=c.get(a))&&(u[1]=!0,u[0].forEach((function(n){return n(i)})))))},k=function(n,r){var e=t(r);if(s(e)){if(e.m&&!e.x)return e;if(Array.from(e.d).every((function(r){var e=r[0],t=r[1];return k(n,e).n===t})))return e}e.d.clear();var o,i,c=!0,v={get signal(){return o||(o=new AbortController),o.signal},get setSelf(){return!i&&l(r)&&(i=function(){if(!c){for(var n=arguments.length,e=new Array(n),t=0;t<n;t++)e[t]=arguments[t];return D.apply(void 0,[r].concat(e))}}),i}};try{var p=a(r,(function(a){if(u(r,a)){var o=t(a);if(!s(o)){if(!f(a))throw new Error("no atom init");M(a,o,a.init)}return y(o)}var i=k(n,a);try{return y(i)}finally{if(c)h(n,r,e,a,i);else{var l=m();h(l,r,e,a,i),L(l,r,e),S(l)}}}),v);if(M(r,e,p),d(p)){null==p.onCancel||p.onCancel((function(){var n;return null==(n=o)?void 0:n.abort()}));var w=function(){if(e.m){var n=m();L(n,r,e),S(n)}};p.then(w,w)}return e}catch(n){return delete e.v,e.e=n,delete e.x,++e.n,e}finally{c=!1}},x=function(n,r,e){for(var a,i,u=new Map,f=o((null==(l=e.m)?void 0:l.t)||[]);!(i=f()).done;){var l,c=i.value,v=t(c);v.m&&u.set(c,v)}for(var d,s=o(e.p);!(d=s()).done;){var y=d.value;u.set(y,t(y))}return null==(a=function(n,r){return n.D.get(r)}(n,r))||a.forEach((function(n){u.set(n,t(n))})),u},E=function(n,r){var e=!0;try{for(var a=arguments.length,l=new Array(a>2?a-2:0),c=2;c<a;c++)l[c-2]=arguments[c];return i.apply(void 0,[r,function(r){return y(k(n,r))},function(a){var i=t(a);try{for(var l=arguments.length,c=new Array(l>1?l-1:0),v=1;v<l;v++)c[v-1]=arguments[v];if(u(r,a)){if(!f(a))throw new Error("atom not writable");var d=i.n,s=c[0];return M(a,i,s),L(n,a,i),void(d!==i.n&&(g(n,a,i),function(n,r,e){for(var t=[],a=new Set,i=new Set,u=[[r,e]];u.length>0;){var f=u[u.length-1],l=f[0],c=f[1];if(i.has(l))u.pop();else if(a.has(l))t.push([l,c,c.n]),i.add(l),c.x=!0,u.pop();else{a.add(l);for(var v,d=o(x(n,l,c));!(v=d()).done;){var s=v.value,y=s[0],p=s[1];l===y||a.has(y)||u.push([y,p])}}}w(n,"H",(function(){for(var e=new Set([r]),a=t.length-1;a>=0;--a){for(var i,u=t[a],f=u[0],l=u[1],c=u[2],v=!1,d=o(l.d.keys());!(i=d()).done;){var s=i.value;if(s!==f&&e.has(s)){v=!0;break}}v&&(k(n,f),L(n,f,l),c!==l.n&&(g(n,f,l),e.add(f))),delete l.x}}))}(n,a,i)))}return E.apply(void 0,[n,a].concat(c))}finally{e||S(n)}}].concat(l))}finally{e=!1}},D=function(n){var r=m();try{for(var e=arguments.length,t=new Array(e>1?e-1:0),a=1;a<e;a++)t[a-1]=arguments[a];return E.apply(void 0,[r,n].concat(t))}finally{S(r)}},L=function(n,r,e){if(e.m&&!v(e.v)){for(var a,i=o(e.d.keys());!(a=i()).done;){var u=a.value;if(!e.m.d.has(u))j(n,u,t(u)).t.add(r),e.m.d.add(u)}for(var f,l=o(e.m.d||[]);!(f=l()).done;){var c=f.value;if(!e.d.has(c)){e.m.d.delete(c);var d=C(n,c,t(c));null==d||d.t.delete(r)}}}},j=function(n,r,e){if(!e.m){k(n,r);for(var a,i=o(e.d.keys());!(a=i()).done;){var u=a.value;j(n,u,t(u)).t.add(r)}if(e.m={l:new Set,d:new Set(e.d.keys()),t:new Set},l(r)){var f,c=e.m,v=function(n,e){var t=!0;f=function(){try{for(var e=arguments.length,a=new Array(e),o=0;o<e;o++)a[o]=arguments[o];return E.apply(void 0,[n,r].concat(a))}finally{t||S(n)}};try{return e()}finally{t=!1}};w(n,"L",(function(){var e=v(n,(function(){return b(r,(function(){return f.apply(void 0,arguments)}))}));e&&(c.u=function(n){return v(n,e)})}))}}return e.m},C=function(n,r,e){if(!e.m||e.m.l.size||Array.from(e.m.t).some((function(n){var e;return null==(e=t(n).m)?void 0:e.d.has(r)})))return e.m;var a=e.m.u;a&&w(n,"L",(function(){return a(n)})),delete e.m;for(var i,u=o(e.d.keys());!(i=u()).done;){var f=i.value,l=C(n,f,t(f));null==l||l.t.delete(r)}},H={get:function(n){return y(k(void 0,n))},set:D,sub:function(n,r){var e=m(),a=t(n),o=j(e,n,a).l;return o.add(r),S(e),function(){o.delete(r);var e=m();C(e,n,a),S(e)}},unstable_derive:function(n){return A.apply(void 0,n(t,a,i,b))}};return H},M=function(){var n=new WeakMap,r=A((function(r){var e=n.get(r);return e||(e={d:new Map,p:new Set,n:0},n.set(r,e)),e}),(function(n){for(var r=arguments.length,e=new Array(r>1?r-1:0),t=1;t<r;t++)e[t-1]=arguments[t];return n.read.apply(n,e)}),(function(n){for(var r=arguments.length,e=new Array(r>1?r-1:0),t=1;t<r;t++)e[t-1]=arguments[t];return n.write.apply(n,e)}),(function(n){for(var r=arguments.length,e=new Array(r>1?r-1:0),t=1;t<r;t++)e[t-1]=arguments[t];return null==n.onMount?void 0:n.onMount.apply(n,e)}));return r};n.atom=function(n,a){var o="atom"+ ++r,i={toString:function(){return o}};return"function"==typeof n?i.read=n:(i.init=n,i.read=e,i.write=t),a&&(i.write=a),i},n.createStore=M,n.getDefaultStore=function(){return i||(i=M()),i}})); |
369
vanilla.js
@@ -124,3 +124,3 @@ 'use strict'; | ||
}; | ||
var addDependency = function addDependency(pending, atom, atomState, a, aState) { | ||
var addDependency = function addDependency(batch, atom, atomState, a, aState) { | ||
var _aState$m; | ||
@@ -135,17 +135,30 @@ if (process.env.NODE_ENV !== 'production' && a === atom) { | ||
(_aState$m = aState.m) == null || _aState$m.t.add(atom); | ||
if (pending) { | ||
addPendingDependent(pending, a, atom); | ||
if (batch) { | ||
addBatchAtomDependent(batch, a, atom); | ||
} | ||
}; | ||
var createPending = function createPending() { | ||
return [new Map(), new Map(), new Set()]; | ||
var createBatch = function createBatch() { | ||
return { | ||
D: new Map(), | ||
H: new Set(), | ||
M: new Set(), | ||
L: new Set() | ||
}; | ||
}; | ||
var addPendingAtom = function addPendingAtom(pending, atom, atomState) { | ||
if (!pending[0].has(atom)) { | ||
pending[0].set(atom, new Set()); | ||
var addBatchFunc = function addBatchFunc(batch, priority, fn) { | ||
batch[priority].add(fn); | ||
}; | ||
var registerBatchAtom = function registerBatchAtom(batch, atom, atomState) { | ||
if (!batch.D.has(atom)) { | ||
batch.D.set(atom, new Set()); | ||
addBatchFunc(batch, 'M', function () { | ||
var _atomState$m; | ||
(_atomState$m = atomState.m) == null || _atomState$m.l.forEach(function (listener) { | ||
return addBatchFunc(batch, 'M', listener); | ||
}); | ||
}); | ||
} | ||
pending[1].set(atom, atomState); | ||
}; | ||
var addPendingDependent = function addPendingDependent(pending, atom, dependent) { | ||
var dependents = pending[0].get(atom); | ||
var addBatchAtomDependent = function addBatchAtomDependent(batch, atom, dependent) { | ||
var dependents = batch.D.get(atom); | ||
if (dependents) { | ||
@@ -155,9 +168,6 @@ dependents.add(dependent); | ||
}; | ||
var getPendingDependents = function getPendingDependents(pending, atom) { | ||
return pending[0].get(atom); | ||
var getBatchAtomDependents = function getBatchAtomDependents(batch, atom) { | ||
return batch.D.get(atom); | ||
}; | ||
var addPendingFunction = function addPendingFunction(pending, fn) { | ||
pending[2].add(fn); | ||
}; | ||
var flushPending = function flushPending(pending) { | ||
var flushBatch = function flushBatch(batch) { | ||
var error; | ||
@@ -175,13 +185,10 @@ var hasError = false; | ||
}; | ||
while (pending[1].size || pending[2].size) { | ||
pending[0].clear(); | ||
var _atomStates = new Set(pending[1].values()); | ||
pending[1].clear(); | ||
var _functions = new Set(pending[2]); | ||
pending[2].clear(); | ||
_atomStates.forEach(function (atomState) { | ||
var _atomState$m; | ||
return (_atomState$m = atomState.m) == null ? void 0 : _atomState$m.l.forEach(call); | ||
}); | ||
_functions.forEach(call); | ||
while (batch.H.size || batch.M.size || batch.L.size) { | ||
batch.D.clear(); | ||
batch.H.forEach(call); | ||
batch.H.clear(); | ||
batch.M.forEach(call); | ||
batch.M.clear(); | ||
batch.L.forEach(call); | ||
batch.L.clear(); | ||
} | ||
@@ -200,6 +207,2 @@ if (hasError) { | ||
atomOnMount = _ref[3]; | ||
var debugMountedAtoms; | ||
if (process.env.NODE_ENV !== 'production') { | ||
debugMountedAtoms = new Set(); | ||
} | ||
var setAtomStateValueOrPromise = function setAtomStateValueOrPromise(atom, atomState, valueOrPromise) { | ||
@@ -216,7 +219,7 @@ var hasPrevValue = 'v' in atomState; | ||
atomState.v = valueOrPromise; | ||
delete atomState.e; | ||
} else { | ||
atomState.v = valueOrPromise; | ||
delete atomState.e; | ||
} | ||
delete atomState.e; | ||
delete atomState.x; | ||
if (!hasPrevValue || !Object.is(prevValue, atomState.v)) { | ||
@@ -229,6 +232,6 @@ ++atomState.n; | ||
}; | ||
var _readAtomState = function readAtomState(pending, atom, dirtyAtoms) { | ||
var _readAtomState = function readAtomState(batch, atom) { | ||
var atomState = getAtomState(atom); | ||
if (isAtomStateInitialized(atomState)) { | ||
if (atomState.m && !(dirtyAtoms != null && dirtyAtoms.has(atom))) { | ||
if (atomState.m && !atomState.x) { | ||
return atomState; | ||
@@ -239,3 +242,3 @@ } | ||
n = _ref2[1]; | ||
return (_readAtomState(pending, a, dirtyAtoms).n === n | ||
return (_readAtomState(batch, a).n === n | ||
); | ||
@@ -260,3 +263,3 @@ })) { | ||
} | ||
var aState = _readAtomState(pending, a, dirtyAtoms); | ||
var aState = _readAtomState(batch, a); | ||
try { | ||
@@ -266,8 +269,8 @@ return returnAtomValue(aState); | ||
if (isSync) { | ||
addDependency(pending, atom, atomState, a, aState); | ||
addDependency(batch, atom, atomState, a, aState); | ||
} else { | ||
var _pending = createPending(); | ||
addDependency(_pending, atom, atomState, a, aState); | ||
mountDependencies(_pending, atom, atomState); | ||
flushPending(_pending); | ||
var _batch = createBatch(); | ||
addDependency(_batch, atom, atomState, a, aState); | ||
mountDependencies(_batch, atom, atomState); | ||
flushBatch(_batch); | ||
} | ||
@@ -315,5 +318,5 @@ } | ||
if (atomState.m) { | ||
var _pending2 = createPending(); | ||
mountDependencies(_pending2, atom, atomState); | ||
flushPending(_pending2); | ||
var _batch2 = createBatch(); | ||
mountDependencies(_batch2, atom, atomState); | ||
flushBatch(_batch2); | ||
} | ||
@@ -327,2 +330,3 @@ }; | ||
atomState.e = error; | ||
delete atomState.x; | ||
++atomState.n; | ||
@@ -337,4 +341,4 @@ return atomState; | ||
}; | ||
var getMountedOrPendingDependents = function getMountedOrPendingDependents(pending, atom, atomState) { | ||
var _getPendingDependents; | ||
var getMountedOrBatchDependents = function getMountedOrBatchDependents(batch, atom, atomState) { | ||
var _getBatchAtomDependen; | ||
var dependents = new Map(); | ||
@@ -353,3 +357,3 @@ for (var _iterator2 = _createForOfIteratorHelperLoose(((_atomState$m2 = atomState.m) == null ? void 0 : _atomState$m2.t) || []), _step2; !(_step2 = _iterator2()).done;) { | ||
} | ||
(_getPendingDependents = getPendingDependents(pending, atom)) == null || _getPendingDependents.forEach(function (dependent) { | ||
(_getBatchAtomDependen = getBatchAtomDependents(batch, atom)) == null || _getBatchAtomDependen.forEach(function (dependent) { | ||
dependents.set(dependent, getAtomState(dependent)); | ||
@@ -359,7 +363,7 @@ }); | ||
}; | ||
function getSortedDependents(pending, rootAtom, rootAtomState) { | ||
var sorted = []; | ||
var recomputeDependents = function recomputeDependents(batch, atom, atomState) { | ||
var topSortedReversed = []; | ||
var visiting = new Set(); | ||
var visited = new Set(); | ||
var stack = [[rootAtom, rootAtomState]]; | ||
var stack = [[atom, atomState]]; | ||
while (stack.length > 0) { | ||
@@ -374,4 +378,5 @@ var _ref3 = stack[stack.length - 1], | ||
if (visiting.has(a)) { | ||
sorted.push([a, aState, aState.n]); | ||
topSortedReversed.push([a, aState, aState.n]); | ||
visited.add(a); | ||
aState.x = true; | ||
stack.pop(); | ||
@@ -381,3 +386,3 @@ continue; | ||
visiting.add(a); | ||
for (var _iterator4 = _createForOfIteratorHelperLoose(getMountedOrPendingDependents(pending, a, aState)), _step4; !(_step4 = _iterator4()).done;) { | ||
for (var _iterator4 = _createForOfIteratorHelperLoose(getMountedOrBatchDependents(batch, a, aState)), _step4; !(_step4 = _iterator4()).done;) { | ||
var _step4$value = _step4.value, | ||
@@ -391,37 +396,33 @@ d = _step4$value[0], | ||
} | ||
return [sorted, visited]; | ||
} | ||
var recomputeDependents = function recomputeDependents(pending, atom, atomState) { | ||
var _getSortedDependents = getSortedDependents(pending, atom, atomState), | ||
topsortedAtoms = _getSortedDependents[0], | ||
markedAtoms = _getSortedDependents[1]; | ||
var changedAtoms = new Set([atom]); | ||
for (var i = topsortedAtoms.length - 1; i >= 0; --i) { | ||
var _ref4 = topsortedAtoms[i], | ||
a = _ref4[0], | ||
aState = _ref4[1], | ||
prevEpochNumber = _ref4[2]; | ||
var hasChangedDeps = false; | ||
for (var _iterator5 = _createForOfIteratorHelperLoose(aState.d.keys()), _step5; !(_step5 = _iterator5()).done;) { | ||
var dep = _step5.value; | ||
if (dep !== a && changedAtoms.has(dep)) { | ||
hasChangedDeps = true; | ||
break; | ||
addBatchFunc(batch, 'H', function () { | ||
var changedAtoms = new Set([atom]); | ||
for (var i = topSortedReversed.length - 1; i >= 0; --i) { | ||
var _ref4 = topSortedReversed[i], | ||
_a = _ref4[0], | ||
_aState2 = _ref4[1], | ||
prevEpochNumber = _ref4[2]; | ||
var hasChangedDeps = false; | ||
for (var _iterator5 = _createForOfIteratorHelperLoose(_aState2.d.keys()), _step5; !(_step5 = _iterator5()).done;) { | ||
var dep = _step5.value; | ||
if (dep !== _a && changedAtoms.has(dep)) { | ||
hasChangedDeps = true; | ||
break; | ||
} | ||
} | ||
} | ||
if (hasChangedDeps) { | ||
_readAtomState(pending, a, markedAtoms); | ||
mountDependencies(pending, a, aState); | ||
if (prevEpochNumber !== aState.n) { | ||
addPendingAtom(pending, a, aState); | ||
changedAtoms.add(a); | ||
if (hasChangedDeps) { | ||
_readAtomState(batch, _a); | ||
mountDependencies(batch, _a, _aState2); | ||
if (prevEpochNumber !== _aState2.n) { | ||
registerBatchAtom(batch, _a, _aState2); | ||
changedAtoms.add(_a); | ||
} | ||
} | ||
delete _aState2.x; | ||
} | ||
markedAtoms.delete(a); | ||
} | ||
}); | ||
}; | ||
var _writeAtomState = function writeAtomState(pending, atom) { | ||
var _writeAtomState = function writeAtomState(batch, atom) { | ||
var isSync = true; | ||
var getter = function getter(a) { | ||
return returnAtomValue(_readAtomState(pending, a)); | ||
return returnAtomValue(_readAtomState(batch, a)); | ||
}; | ||
@@ -441,14 +442,14 @@ var setter = function setter(a) { | ||
setAtomStateValueOrPromise(a, aState, v); | ||
mountDependencies(pending, a, aState); | ||
mountDependencies(batch, a, aState); | ||
if (prevEpochNumber !== aState.n) { | ||
addPendingAtom(pending, a, aState); | ||
recomputeDependents(pending, a, aState); | ||
registerBatchAtom(batch, a, aState); | ||
recomputeDependents(batch, a, aState); | ||
} | ||
return undefined; | ||
} else { | ||
return _writeAtomState.apply(void 0, [pending, a].concat(args)); | ||
return _writeAtomState.apply(void 0, [batch, a].concat(args)); | ||
} | ||
} finally { | ||
if (!isSync) { | ||
flushPending(pending); | ||
flushBatch(batch); | ||
} | ||
@@ -467,3 +468,3 @@ } | ||
var writeAtom = function writeAtom(atom) { | ||
var pending = createPending(); | ||
var batch = createBatch(); | ||
try { | ||
@@ -473,8 +474,8 @@ for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { | ||
} | ||
return _writeAtomState.apply(void 0, [pending, atom].concat(args)); | ||
return _writeAtomState.apply(void 0, [batch, atom].concat(args)); | ||
} finally { | ||
flushPending(pending); | ||
flushBatch(batch); | ||
} | ||
}; | ||
var mountDependencies = function mountDependencies(pending, atom, atomState) { | ||
var mountDependencies = function mountDependencies(batch, atom, atomState) { | ||
if (atomState.m && !isPendingPromise(atomState.v)) { | ||
@@ -484,3 +485,3 @@ for (var _iterator6 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step6; !(_step6 = _iterator6()).done;) { | ||
if (!atomState.m.d.has(a)) { | ||
var aMounted = _mountAtom(pending, a, getAtomState(a)); | ||
var aMounted = _mountAtom(batch, a, getAtomState(a)); | ||
aMounted.t.add(atom); | ||
@@ -491,6 +492,6 @@ atomState.m.d.add(a); | ||
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, getAtomState(_a)); | ||
var _a2 = _step7.value; | ||
if (!atomState.d.has(_a2)) { | ||
atomState.m.d.delete(_a2); | ||
var _aMounted = _unmountAtom(batch, _a2, getAtomState(_a2)); | ||
_aMounted == null || _aMounted.t.delete(atom); | ||
@@ -501,8 +502,8 @@ } | ||
}; | ||
var _mountAtom = function mountAtom(pending, atom, atomState) { | ||
var _mountAtom = function mountAtom(batch, atom, atomState) { | ||
if (!atomState.m) { | ||
_readAtomState(pending, atom); | ||
_readAtomState(batch, atom); | ||
for (var _iterator8 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step8; !(_step8 = _iterator8()).done;) { | ||
var a = _step8.value; | ||
var aMounted = _mountAtom(pending, a, getAtomState(a)); | ||
var aMounted = _mountAtom(batch, a, getAtomState(a)); | ||
aMounted.t.add(atom); | ||
@@ -515,9 +516,6 @@ } | ||
}; | ||
if (process.env.NODE_ENV !== 'production') { | ||
debugMountedAtoms.add(atom); | ||
} | ||
if (isActuallyWritableAtom(atom)) { | ||
var mounted = atomState.m; | ||
var _setAtom; | ||
var createInvocationContext = function createInvocationContext(pending, fn) { | ||
var createInvocationContext = function createInvocationContext(batch, fn) { | ||
var isSync = true; | ||
@@ -529,6 +527,6 @@ _setAtom = function _setAtom() { | ||
} | ||
return _writeAtomState.apply(void 0, [pending, atom].concat(args)); | ||
return _writeAtomState.apply(void 0, [batch, atom].concat(args)); | ||
} finally { | ||
if (!isSync) { | ||
flushPending(pending); | ||
flushBatch(batch); | ||
} | ||
@@ -543,4 +541,4 @@ } | ||
}; | ||
addPendingFunction(pending, function () { | ||
var onUnmount = createInvocationContext(pending, function () { | ||
addBatchFunc(batch, 'L', function () { | ||
var onUnmount = createInvocationContext(batch, function () { | ||
return atomOnMount(atom, function () { | ||
@@ -551,4 +549,4 @@ return _setAtom.apply(void 0, arguments); | ||
if (onUnmount) { | ||
mounted.u = function (pending) { | ||
return createInvocationContext(pending, onUnmount); | ||
mounted.u = function (batch) { | ||
return createInvocationContext(batch, onUnmount); | ||
}; | ||
@@ -561,3 +559,3 @@ } | ||
}; | ||
var _unmountAtom = function unmountAtom(pending, atom, atomState) { | ||
var _unmountAtom = function unmountAtom(batch, atom, atomState) { | ||
if (atomState.m && !atomState.m.l.size && !Array.from(atomState.m.t).some(function (a) { | ||
@@ -569,13 +567,10 @@ var _getAtomState$m; | ||
if (onUnmount) { | ||
addPendingFunction(pending, function () { | ||
return onUnmount(pending); | ||
addBatchFunc(batch, 'L', function () { | ||
return onUnmount(batch); | ||
}); | ||
} | ||
delete atomState.m; | ||
if (process.env.NODE_ENV !== 'production') { | ||
debugMountedAtoms.delete(atom); | ||
} | ||
for (var _iterator9 = _createForOfIteratorHelperLoose(atomState.d.keys()), _step9; !(_step9 = _iterator9()).done;) { | ||
var a = _step9.value; | ||
var aMounted = _unmountAtom(pending, a, getAtomState(a)); | ||
var aMounted = _unmountAtom(batch, a, getAtomState(a)); | ||
aMounted == null || aMounted.t.delete(atom); | ||
@@ -588,13 +583,13 @@ } | ||
var subscribeAtom = function subscribeAtom(atom, listener) { | ||
var pending = createPending(); | ||
var batch = createBatch(); | ||
var atomState = getAtomState(atom); | ||
var mounted = _mountAtom(pending, atom, atomState); | ||
var mounted = _mountAtom(batch, atom, atomState); | ||
var listeners = mounted.l; | ||
listeners.add(listener); | ||
flushPending(pending); | ||
flushBatch(batch); | ||
return function () { | ||
listeners.delete(listener); | ||
var pending = createPending(); | ||
_unmountAtom(pending, atom, atomState); | ||
flushPending(pending); | ||
var batch = createBatch(); | ||
_unmountAtom(batch, atom, atomState); | ||
flushBatch(batch); | ||
}; | ||
@@ -611,41 +606,83 @@ }; | ||
}; | ||
if (process.env.NODE_ENV !== 'production') { | ||
var devStore = { | ||
dev4_get_internal_weak_map: function dev4_get_internal_weak_map() { | ||
return { | ||
get: function get(atom) { | ||
var atomState = getAtomState(atom); | ||
if (atomState.n === 0) { | ||
return undefined; | ||
return store; | ||
}; | ||
var deriveDevStoreRev4 = function deriveDevStoreRev4(store) { | ||
var proxyAtomStateMap = new WeakMap(); | ||
var debugMountedAtoms = new Set(); | ||
var savedGetAtomState; | ||
var inRestoreAtom = 0; | ||
var derivedStore = store.unstable_derive(function (getAtomState, atomRead, atomWrite, atomOnMount) { | ||
savedGetAtomState = getAtomState; | ||
return [function (atom) { | ||
var proxyAtomState = proxyAtomStateMap.get(atom); | ||
if (!proxyAtomState) { | ||
var atomState = getAtomState(atom); | ||
proxyAtomState = new Proxy(atomState, { | ||
set: function set(target, prop, value) { | ||
if (prop === 'm') { | ||
debugMountedAtoms.add(atom); | ||
} | ||
return atomState; | ||
return Reflect.set(target, prop, value); | ||
}, | ||
deleteProperty: function deleteProperty(target, prop) { | ||
if (prop === 'm') { | ||
debugMountedAtoms.delete(atom); | ||
} | ||
return Reflect.deleteProperty(target, prop); | ||
} | ||
}; | ||
}, | ||
dev4_get_mounted_atoms: function dev4_get_mounted_atoms() { | ||
return debugMountedAtoms; | ||
}, | ||
dev4_restore_atoms: function dev4_restore_atoms(values) { | ||
var pending = createPending(); | ||
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 prevEpochNumber = atomState.n; | ||
setAtomStateValueOrPromise(_atom, atomState, value); | ||
mountDependencies(pending, _atom, atomState); | ||
if (prevEpochNumber !== atomState.n) { | ||
addPendingAtom(pending, _atom, atomState); | ||
recomputeDependents(pending, _atom, atomState); | ||
}); | ||
proxyAtomStateMap.set(atom, proxyAtomState); | ||
} | ||
return proxyAtomState; | ||
}, atomRead, function (atom, getter, setter) { | ||
for (var _len7 = arguments.length, args = new Array(_len7 > 3 ? _len7 - 3 : 0), _key7 = 3; _key7 < _len7; _key7++) { | ||
args[_key7 - 3] = arguments[_key7]; | ||
} | ||
if (inRestoreAtom) { | ||
return setter.apply(void 0, [atom].concat(args)); | ||
} | ||
return atomWrite.apply(void 0, [atom, getter, setter].concat(args)); | ||
}, atomOnMount]; | ||
}); | ||
var savedStoreSet = derivedStore.set; | ||
var devStore = { | ||
dev4_get_internal_weak_map: function dev4_get_internal_weak_map() { | ||
return { | ||
get: function get(atom) { | ||
var atomState = savedGetAtomState(atom); | ||
if (atomState.n === 0) { | ||
return undefined; | ||
} | ||
return atomState; | ||
} | ||
}; | ||
}, | ||
dev4_get_mounted_atoms: function dev4_get_mounted_atoms() { | ||
return debugMountedAtoms; | ||
}, | ||
dev4_restore_atoms: function dev4_restore_atoms(values) { | ||
var restoreAtom = { | ||
read: function read() { | ||
return null; | ||
}, | ||
write: function write(_get, set) { | ||
++inRestoreAtom; | ||
try { | ||
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)) { | ||
set(_atom, value); | ||
} | ||
} | ||
} finally { | ||
--inRestoreAtom; | ||
} | ||
} | ||
flushPending(pending); | ||
} | ||
}; | ||
Object.assign(store, devStore); | ||
} | ||
return store; | ||
}; | ||
savedStoreSet(restoreAtom); | ||
} | ||
}; | ||
return Object.assign(derivedStore, devStore); | ||
}; | ||
@@ -669,12 +706,7 @@ var createStore = function createStore() { | ||
}; | ||
return _buildStore(getAtomState, function (atom) { | ||
for (var _len7 = arguments.length, params = new Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) { | ||
params[_key7 - 1] = arguments[_key7]; | ||
} | ||
return atom.read.apply(atom, params); | ||
}, function (atom) { | ||
var store = _buildStore(getAtomState, function (atom) { | ||
for (var _len8 = arguments.length, params = new Array(_len8 > 1 ? _len8 - 1 : 0), _key8 = 1; _key8 < _len8; _key8++) { | ||
params[_key8 - 1] = arguments[_key8]; | ||
} | ||
return atom.write.apply(atom, params); | ||
return atom.read.apply(atom, params); | ||
}, function (atom) { | ||
@@ -684,4 +716,13 @@ for (var _len9 = arguments.length, params = new Array(_len9 > 1 ? _len9 - 1 : 0), _key9 = 1; _key9 < _len9; _key9++) { | ||
} | ||
return atom.write.apply(atom, params); | ||
}, function (atom) { | ||
for (var _len10 = arguments.length, params = new Array(_len10 > 1 ? _len10 - 1 : 0), _key10 = 1; _key10 < _len10; _key10++) { | ||
params[_key10 - 1] = arguments[_key10]; | ||
} | ||
return atom.onMount == null ? void 0 : atom.onMount.apply(atom, params); | ||
}); | ||
if (process.env.NODE_ENV !== 'production') { | ||
return deriveDevStoreRev4(store); | ||
} | ||
return store; | ||
}; | ||
@@ -688,0 +729,0 @@ var defaultStore; |
@@ -21,3 +21,3 @@ import type { Atom, WritableAtom } from './atom'; | ||
/** Function to run when the atom is unmounted. */ | ||
u?: (pending: Pending) => void; | ||
u?: (batch: Batch) => void; | ||
}; | ||
@@ -48,8 +48,15 @@ /** | ||
e?: AnyError; | ||
/** Indicates that the atom value has been changed */ | ||
x?: true; | ||
}; | ||
type Pending = readonly [ | ||
dependents: Map<AnyAtom, Set<AnyAtom>>, | ||
atomStates: Map<AnyAtom, AtomState>, | ||
functions: Set<() => void> | ||
]; | ||
type Batch = Readonly<{ | ||
/** Atom dependents map */ | ||
D: Map<AnyAtom, Set<AnyAtom>>; | ||
/** High priority functions */ | ||
H: Set<() => void>; | ||
/** Medium priority functions */ | ||
M: Set<() => void>; | ||
/** Low priority functions */ | ||
L: Set<() => void>; | ||
}>; | ||
type StoreArgs = readonly [ | ||
@@ -68,3 +75,3 @@ getAtomState: <Value>(atom: Atom<Value>) => AtomState<Value>, | ||
}; | ||
type PrdStore = { | ||
type Store = { | ||
get: <Value>(atom: Atom<Value>) => Value; | ||
@@ -75,7 +82,7 @@ set: <Value, Args extends unknown[], Result>(atom: WritableAtom<Value, Args, Result>, ...args: Args) => Result; | ||
}; | ||
type Store = PrdStore | (PrdStore & DevStoreRev4); | ||
export type INTERNAL_DevStoreRev4 = DevStoreRev4; | ||
export type INTERNAL_PrdStore = PrdStore; | ||
export declare const createStore: () => Store; | ||
export declare const getDefaultStore: () => Store; | ||
export type INTERNAL_PrdStore = Store; | ||
type PrdOrDevStore = Store | (Store & DevStoreRev4); | ||
export declare const createStore: () => PrdOrDevStore; | ||
export declare const getDefaultStore: () => PrdOrDevStore; | ||
export {}; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
443477
9829