@but212/atom-effect 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/dist/atom-effect.min.js +1 -1
- package/dist/atom-effect.min.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +165 -168
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,7 +41,6 @@ dispose();
|
|
|
41
41
|
|
|
42
42
|
- [**API Reference**](./docs/API.md): Detailed usage of `atom`, `computed`, `effect`.
|
|
43
43
|
- [**Architecture**](./docs/ARCHITECTURE.md): Deep dive into the epoch-based propagation system.
|
|
44
|
-
- [**Onboarding**](./docs/ONBOARDING.md): Guide for contributors and new team members.
|
|
45
44
|
|
|
46
45
|
## License
|
|
47
46
|
|
package/dist/atom-effect.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(c,y){typeof exports=="object"&&typeof module<"u"?y(exports):typeof define=="function"&&define.amd?define(["exports"],y):(c=typeof globalThis<"u"?globalThis:c||self,y(c.AtomEffect={}))})(this,(function(c){"use strict";const y={ONE_SECOND_MS:1e3},m={IDLE:"idle",PENDING:"pending",RESOLVED:"resolved",REJECTED:"rejected"},S={DISPOSED:1,HAS_FN_SUBS:2,HAS_OBJ_SUBS:4},E={...S,EXECUTING:8},o={...S,DIRTY:8,IDLE:16,PENDING:32,RESOLVED:64,REJECTED:128,RECOMPUTING:256,HAS_ERROR:512},d={...S,SYNC:8,NOTIFICATION_SCHEDULED:16},rt={MAX_SIZE:1e3,WARMUP_SIZE:100},p={MAX_EXECUTIONS_PER_SECOND:1e3,MAX_EXECUTIONS_PER_EFFECT:100,MAX_EXECUTIONS_PER_FLUSH:1e4,MAX_FLUSH_ITERATIONS:1e3,MIN_FLUSH_ITERATIONS:10,CLEANUP_THRESHOLD:1e3,BATCH_QUEUE_SHRINK_THRESHOLD:1e3},k={MAX_DEPENDENCIES:1e3,WARN_INFINITE_LOOP:!0},b=1073741823,_=typeof process<"u"&&process.env&&process.env.NODE_ENV!=="production"||typeof __DEV__<"u"&&!!__DEV__,ot=Object.freeze([]);class O extends Error{constructor(t,e=null,s=!0){super(t),this.cause=e,this.recoverable=s,this.timestamp=new Date,this.name="AtomError"}}class I extends O{constructor(t,e=null){super(t,e,!0),this.name="ComputedError"}}class D extends O{constructor(t,e=null){super(t,e,!1),this.name="EffectError"}}class R extends O{constructor(t,e=null){super(t,e,!1),this.name="SchedulerError"}}const H=Symbol("AtomEffect.DebugName"),ht=Symbol("AtomEffect.Id"),G=Symbol("AtomEffect.Type"),P=Symbol("AtomEffect.NoDefaultValue"),ct=i=>"dependencies"in i&&Array.isArray(i.dependencies);function V(i,t,e){if(i===t)throw new I("Circular dependency detected: The computation refers to itself explicitly or implicitly.");if(!e.has(i.id)&&(e.add(i.id),ct(i))){const s=i.dependencies;for(let n=0;n<s.length;n++){const r=s[n];r&&V(r,t,e)}}}const g={enabled:_,maxDependencies:k.MAX_DEPENDENCIES,warnInfiniteLoop:k.WARN_INFINITE_LOOP,warn(i,t){_&&this.enabled&&i&&console.warn(`[Atom Effect] ${t}`)},checkCircular(i,t){if(i===t)throw new I("Direct circular dependency detected");_&&this.enabled&&V(i,t,new Set)},attachDebugInfo(i,t,e){if(!_||!this.enabled)return;const s=i;s[H]=`${t}_${e}`,s[ht]=e,s[G]=t},getDebugName:i=>i?.[H],getDebugType:i=>i?.[G]};let ut=1;const _t=()=>ut++;function z(i,t,e){if(typeof t=="function"){const n=t;for(let r=0,h=e.length;r<h;r++){const u=e[r];if(u&&u.fn===n)return}e.push(new M(n,void 0)),i.flags|=S.HAS_FN_SUBS,"_fnSubCount"in i&&i._fnSubCount++;return}if("addDependency"in t){t.addDependency(i);return}const s=t;for(let n=0,r=e.length;n<r;n++){const h=e[n];if(h&&h.sub===s)return}e.push(new M(void 0,s)),i.flags|=S.HAS_OBJ_SUBS,"_objSubCount"in i&&i._objSubCount++}function lt(i,t,e){for(let s=0,n=t.length;s<n;s++){const r=t[s];r&&(r.node._tempUnsub=r.unsub)}for(let s=0,n=i.length;s<n;s++){const r=i[s];if(!r)continue;const h=r.node;h._tempUnsub!==void 0?(r.unsub=h._tempUnsub,h._tempUnsub=void 0):(g.checkCircular(h,e),r.unsub=h.subscribe(e))}for(let s=0,n=t.length;s<n;s++){const r=t[s];if(r){const h=r.node;h._tempUnsub!==void 0&&(h._tempUnsub(),h._tempUnsub=void 0),r.unsub=void 0}}}class x{constructor(t,e,s=void 0){this.node=t,this.version=e,this.unsub=s}}class M{constructor(t,e){this.fn=t,this.sub=e}}const l={COMPUTED_MUST_BE_FUNCTION:"Computed target must be a function",COMPUTED_ASYNC_PENDING_NO_DEFAULT:"Async computation pending with no default value",COMPUTED_COMPUTATION_FAILED:"Computation execution failed",COMPUTED_ASYNC_COMPUTATION_FAILED:"Async computation execution failed",COMPUTED_CIRCULAR_DEPENDENCY:"Circular dependency detected",COMPUTED_DISPOSED:"Attempted to access disposed computed",ATOM_SUBSCRIBER_MUST_BE_FUNCTION:"Subscriber must be a function or Subscriber object",ATOM_INDIVIDUAL_SUBSCRIBER_FAILED:"Subscriber execution failed",EFFECT_MUST_BE_FUNCTION:"Effect target must be a function",EFFECT_EXECUTION_FAILED:"Effect execution failed",EFFECT_CLEANUP_FAILED:"Effect cleanup failed",EFFECT_DISPOSED:"Attempted to run disposed effect",CALLBACK_ERROR_IN_ERROR_HANDLER:"Exception encountered in onError handler"};function N(i,t,e){if(i instanceof O)return i;const s=i instanceof Error,n=s?i.message:String(i),r=s?i:void 0;let h="Unexpected error";i instanceof TypeError?h="Type error":i instanceof ReferenceError&&(h="Reference error");const u=`${h} (${e}): ${n}`;return new t(u,r)}class X{constructor(){this.flags=0,this.version=0,this._lastSeenEpoch=-1,this._modifiedAtEpoch=-1,this.id=_t()&b,this._tempUnsub=void 0}}class j extends X{constructor(){super(...arguments),this._fnSubCount=0,this._objSubCount=0}subscribe(t){const e=typeof t=="function";if(!e&&(!t||typeof t.execute!="function"))throw N(new TypeError("Invalid subscriber"),O,l.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);const s=this._subscribers;for(let r=0,h=s.length;r<h;r++){const u=s[r];if(u&&(e?u.fn===t:u.sub===t))return _&&console.warn("Duplicate subscription ignored."),()=>{}}const n=new M(e?t:void 0,e?void 0:t);return s.push(n),e?(this._fnSubCount++,this.flags|=S.HAS_FN_SUBS):(this._objSubCount++,this.flags|=S.HAS_OBJ_SUBS),()=>this._unsubscribe(n)}_unsubscribe(t){const e=this._subscribers,s=e.indexOf(t);if(s===-1)return;const n=e.pop();s<e.length&&n&&(e[s]=n),t.fn?this._fnSubCount--:this._objSubCount--,e.length===0?(this.flags&=-7,this._fnSubCount=0,this._objSubCount=0):t.fn&&this._fnSubCount<=0?(this.flags&=-3,this._fnSubCount=0):!t.fn&&this._objSubCount<=0&&(this.flags&=-5,this._objSubCount=0)}subscriberCount(){return this._subscribers.length}_notifySubscribers(t,e){if(!(this.flags&(S.HAS_FN_SUBS|S.HAS_OBJ_SUBS)))return;const s=this._subscribers,n=s.length;for(let r=0;r<n;r++){const h=s[r];if(h)try{h.fn?h.fn(t,e):h.sub&&h.sub.execute()}catch(u){this._handleNotifyError(u)}}}_handleNotifyError(t){console.error(N(t,O,l.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED))}}let U=0;const Y=()=>(U=U+1&b||1,U),at=()=>U;let v=0,w=0,F=!1;function Q(){return F?(_&&console.warn("startFlush() called during flush - ignored"),!1):(F=!0,v=v+1&b||1,w=0,!0)}const q=()=>{F=!1},ft=()=>F?++w:0,a={_queueBuffer:[[],[]],_bufferIndex:0,_size:0,_epoch:0,_isProcessing:!1,_isBatching:!1,_isFlushingSync:!1,_batchDepth:0,_batchQueue:[],_batchQueueSize:0,_maxFlushIterations:p.MAX_FLUSH_ITERATIONS,get phase(){return this._isProcessing||this._isFlushingSync?2:this._isBatching?1:0},get queueSize(){return this._size},get isBatching(){return this._isBatching},schedule(i){if(_&&typeof i!="function")throw new R("Scheduler callback must be a function");if(i._nextEpoch!==this._epoch){if(i._nextEpoch=this._epoch,this._isBatching||this._isFlushingSync){this._batchQueue[this._batchQueueSize++]=i;return}this._queueBuffer[this._bufferIndex][this._size++]=i,this._isProcessing||this._flush()}},_flush(){this._isProcessing||this._size===0||(this._isProcessing=!0,queueMicrotask(this._runLoop))},_runLoop:()=>{try{if(a._size===0)return;const i=Q();a._drainQueue(),i&&q()}finally{a._isProcessing=!1,a._size>0&&!a._isBatching&&a._flush()}},_flushSync(){this._isFlushingSync=!0;const i=Q();try{this._mergeBatchQueue(),this._drainQueue()}finally{this._isFlushingSync=!1,i&&q()}},_mergeBatchQueue(){if(this._batchQueueSize===0)return;const i=++this._epoch,t=this._batchQueue,e=this._queueBuffer[this._bufferIndex];let s=this._size;for(let n=0;n<this._batchQueueSize;n++){const r=t[n];r._nextEpoch!==i&&(r._nextEpoch=i,e[s++]=r)}this._size=s,this._batchQueueSize=0,t.length>p.BATCH_QUEUE_SHRINK_THRESHOLD&&(t.length=0)},_drainQueue(){let i=0;for(;this._size>0;){if(++i>this._maxFlushIterations){this._handleFlushOverflow();return}this._processQueue(),this._mergeBatchQueue()}},_processQueue(){const i=this._bufferIndex,t=this._queueBuffer[i],e=this._size;this._bufferIndex=i^1,this._size=0,this._epoch++;for(let s=0;s<e;s++)try{t[s]()}catch(n){console.error(new R("Error occurred during scheduler execution",n))}t.length=0},_handleFlushOverflow(){console.error(new R(`Maximum flush iterations (${this._maxFlushIterations}) exceeded. Possible infinite loop.`)),this._size=0,this._queueBuffer[this._bufferIndex].length=0,this._batchQueueSize=0},startBatch(){this._batchDepth++,this._isBatching=!0},endBatch(){if(this._batchDepth===0){_&&console.warn("endBatch() called without matching startBatch(). Ignoring.");return}--this._batchDepth===0&&(this._flushSync(),this._isBatching=!1)},setMaxFlushIterations(i){if(i<p.MIN_FLUSH_ITERATIONS)throw new R(`Max flush iterations must be at least ${p.MIN_FLUSH_ITERATIONS}`);this._maxFlushIterations=i}},T={current:null,run(i,t){const e=this.current;this.current=i;try{return t()}finally{this.current=e}}};function J(i){const t=T.current;if(t===null)return i();T.current=null;try{return i()}finally{T.current=t}}const Et=d.HAS_FN_SUBS|d.HAS_OBJ_SUBS;class dt extends j{constructor(t,e){super(),this._pendingOldValue=void 0,this._notifyTask=void 0,this._subscribers=[],this._value=t,e&&(this.flags|=d.SYNC),g.attachDebugInfo(this,"atom",this.id)}get value(){const t=T.current;return t&&z(this,t,this._subscribers),this._value}set value(t){const e=this._value;if(Object.is(e,t))return;this._value=t,this.version=this.version+1&b;const s=this.flags;if(!((s&Et)===0||s&d.NOTIFICATION_SCHEDULED)){if(this._pendingOldValue=e,this.flags=s|d.NOTIFICATION_SCHEDULED,s&d.SYNC&&!a.isBatching){this._flushNotifications();return}this._notifyTask||(this._notifyTask=()=>this._flushNotifications()),a.schedule(this._notifyTask)}}_flushNotifications(){const t=this.flags;if(!(t&d.NOTIFICATION_SCHEDULED)||t&d.DISPOSED)return;const e=this._pendingOldValue;this._pendingOldValue=void 0,this.flags&=-17,this._notifySubscribers(this._value,e)}peek(){return this._value}dispose(){this.flags&d.DISPOSED||(this._subscribers.length=0,this.flags|=d.DISPOSED,this._value=void 0,this._pendingOldValue=void 0,this._notifyTask=void 0)}}function St(i,t={}){return new dt(i,t.sync??!1)}class pt{constructor(t=50,e=256){this.limit=t,this.capacity=e,this.pool=[],this.stats=_?{acquired:0,released:0,rejected:{frozen:0,tooLarge:0,poolFull:0}}:null}acquire(){return _&&this.stats&&this.stats.acquired++,this.pool.pop()??[]}release(t,e){if(!(e&&t===e)){if(t.length>this.capacity){_&&this.stats&&this.stats.rejected.tooLarge++;return}if(this.pool.length>=this.limit){_&&this.stats&&this.stats.rejected.poolFull++;return}if(Object.isFrozen(t)){_&&this.stats&&this.stats.rejected.frozen++;return}t.length=0,this.pool.push(t),_&&this.stats&&this.stats.released++}}getStats(){if(!_||!this.stats)return null;const{acquired:t,released:e,rejected:s}=this.stats,n=t-e-(s.frozen+s.tooLarge+s.poolFull);return{acquired:t,released:e,rejected:{...s},leaked:n,poolSize:this.pool.length}}reset(){this.pool.length=0,_&&this.stats&&(this.stats={acquired:0,released:0,rejected:{frozen:0,tooLarge:0,poolFull:0}})}}const A=i=>Object.freeze(i);A([]),A([]),A([]),A([]);const f=A([]);A([]);const C=new pt;function $(i){return i!==null&&typeof i=="object"&&"value"in i&&typeof i.subscribe=="function"}function It(i){return $(i)&&typeof i.invalidate=="function"}function Dt(i){return i!==null&&typeof i=="object"&&typeof i.dispose=="function"&&typeof i.run=="function"}function K(i){return i!==null&&typeof i=="object"&&typeof i.then=="function"}const W=o.RESOLVED|o.PENDING|o.REJECTED,L=Array(W+1).fill(m.IDLE);L[o.RESOLVED]=m.RESOLVED,L[o.PENDING]=m.PENDING,L[o.REJECTED]=m.REJECTED;const Z=3,tt=Number.MAX_SAFE_INTEGER-1;class et extends j{constructor(t,e={}){if(typeof t!="function")throw new I(l.COMPUTED_MUST_BE_FUNCTION);if(super(),this._error=null,this._promiseId=0,this._subscribers=[],this._links=f,this._cachedErrors=null,this._errorCacheEpoch=-1,this._asyncStartAggregateVersion=0,this._asyncRetryCount=0,this._trackEpoch=-1,this._trackLinks=f,this._trackCount=0,this._value=void 0,this.flags=o.DIRTY|o.IDLE,this._equal=e.equal??Object.is,this._fn=t,this._defaultValue="defaultValue"in e?e.defaultValue:P,this._onError=e.onError??null,g.attachDebugInfo(this,"computed",this.id),e.lazy===!1)try{this._recompute()}catch{}}_track(){const t=T.current;t&&z(this,t,this._subscribers)}get value(){this._track();const t=this.flags;if((t&(o.RESOLVED|o.DIRTY|o.IDLE))===o.RESOLVED)return this._value;if(t&o.DISPOSED)throw new I(l.COMPUTED_DISPOSED);if(t&o.RECOMPUTING){if(this._defaultValue!==P)return this._defaultValue;throw new I(l.COMPUTED_CIRCULAR_DEPENDENCY)}if(t&(o.DIRTY|o.IDLE)&&(this._recompute(),this.flags&o.RESOLVED))return this._value;const e=this._defaultValue,s=e!==P;if(this.flags&o.PENDING){if(s)return e;throw new I(l.COMPUTED_ASYNC_PENDING_NO_DEFAULT)}if(this.flags&o.REJECTED){if(this._error?.recoverable&&s)return e;throw this._error}return this._value}peek(){return this._value}get state(){return this._track(),L[this.flags&W]}get hasError(){if(this._track(),this.flags&(o.REJECTED|o.HAS_ERROR))return!0;const t=this._links;for(let e=0,s=t.length;e<s;e++){const n=t[e]?.node;if(n&&n.flags&o.HAS_ERROR)return!0}return!1}get isValid(){return!this.hasError}get errors(){if(this._track(),!this.hasError)return ot;const t=at();if(this._errorCacheEpoch===t&&this._cachedErrors)return this._cachedErrors;const e=new Set;this._error&&e.add(this._error);const s=this._links;for(let r=0,h=s.length;r<h;r++){const u=s[r].node;if(u.flags&o.HAS_ERROR){const st=u;if(st.errors){const it=st.errors;for(let B=0;B<it.length;B++){const nt=it[B];nt&&e.add(nt)}}}}const n=Object.freeze(Array.from(e));return this._errorCacheEpoch=t,this._cachedErrors=n,n}get lastError(){return this._track(),this._error}get isPending(){return this._track(),(this.flags&o.PENDING)!==0}get isResolved(){return this._track(),(this.flags&o.RESOLVED)!==0}invalidate(){this._markDirty(),this._errorCacheEpoch=-1,this._cachedErrors=null}dispose(){if(this.flags&o.DISPOSED)return;const t=this._links;if(t!==f){for(let e=0,s=t.length;e<s;e++)t[e].unsub?.();C.release(t),this._links=f}this._subscribers.length=0,this.flags=o.DISPOSED|o.DIRTY|o.IDLE,this._error=null,this._value=void 0,this._promiseId=(this._promiseId+1)%tt,this._cachedErrors=null,this._errorCacheEpoch=-1}addDependency(t){if(t._lastSeenEpoch!==this._trackEpoch){if(t._lastSeenEpoch=this._trackEpoch,this._trackCount<this._trackLinks.length){const e=this._trackLinks[this._trackCount];e.node=t,e.version=t.version}else this._trackLinks.push(new x(t,t.version));this._trackCount++}}_commitDeps(t){this._trackLinks.length=this._trackCount,lt(this._trackLinks,t,this),this._links=this._trackLinks}_recompute(){if(this.flags&o.RECOMPUTING)return;this.flags|=o.RECOMPUTING;const t=this._links;this._trackEpoch=Y(),this._trackLinks=C.acquire(),this._trackCount=0;let e=!1;try{const s=T.run(this,this._fn);this._commitDeps(t),e=!0,K(s)?this._handleAsyncComputation(s):this._finalizeResolution(s)}catch(s){if(!e)try{this._commitDeps(t),e=!0}catch{}this._handleError(s,l.COMPUTED_COMPUTATION_FAILED,!0)}finally{e&&t!==f?C.release(t):e||C.release(this._trackLinks),this._trackEpoch=-1,this._trackLinks=f,this._trackCount=0,this.flags&=-257}}_handleAsyncComputation(t){this.flags=(this.flags|o.PENDING)&-217,this._notifySubscribers(void 0,void 0),this._asyncStartAggregateVersion=this._captureVersionSnapshot(),this._asyncRetryCount=0,this._promiseId=(this._promiseId+1)%tt;const e=this._promiseId;t.then(s=>{if(e===this._promiseId){if(this._captureVersionSnapshot()!==this._asyncStartAggregateVersion)return this._asyncRetryCount++<Z?this._markDirty():this._handleError(new I(`Async drift threshold exceeded after ${Z} retries.`),l.COMPUTED_ASYNC_COMPUTATION_FAILED);this._finalizeResolution(s),this._notifySubscribers(s,void 0)}},s=>e===this._promiseId&&this._handleError(s,l.COMPUTED_ASYNC_COMPUTATION_FAILED))}_captureVersionSnapshot(){let t=0;const e=this._links;for(let s=0,n=e.length;s<n;s++)t=((t<<5)-t|0)+e[s].node.version&b;return t}_handleError(t,e,s=!1){const n=N(t,I,e);if(!s&&!(this.flags&o.REJECTED)&&(this.version=this.version+1&b),this._error=n,this.flags=this.flags&-121|(o.REJECTED|o.HAS_ERROR),this._onError)try{this._onError(n)}catch(r){console.error(l.CALLBACK_ERROR_IN_ERROR_HANDLER,r)}if(s)throw n;this._notifySubscribers(void 0,void 0)}_finalizeResolution(t){(!(this.flags&o.RESOLVED)||!this._equal(this._value,t))&&(this.version=this.version+1&b),this._value=t,this._error=null,this.flags=(this.flags|o.RESOLVED)&-697,this._cachedErrors=null,this._errorCacheEpoch=-1}execute(){this._markDirty()}_markDirty(){this.flags&(o.RECOMPUTING|o.DIRTY)||(this.flags|=o.DIRTY,this._notifySubscribers(void 0,void 0))}}Object.freeze(et.prototype);function gt(i,t={}){return new et(i,t)}class Ct extends X{constructor(t,e={}){super(),this._cleanup=null,this._links=f,this._nextLinks=null,this._currentEpoch=-1,this._lastFlushEpoch=-1,this._executionsInEpoch=0,this._executionCount=0,this._historyPtr=0,this._execId=0,this._fn=t,this._onError=e.onError??null,this._sync=e.sync??!1,this._maxExecutions=e.maxExecutionsPerSecond??p.MAX_EXECUTIONS_PER_SECOND,this._maxExecutionsPerFlush=e.maxExecutionsPerFlush??p.MAX_EXECUTIONS_PER_EFFECT,this._trackModifications=e.trackModifications??!1;const s=Number.isFinite(this._maxExecutions),n=s?Math.min(this._maxExecutions+1,p.MAX_EXECUTIONS_PER_SECOND+1):0;this._historyCapacity=n,this._history=_&&s&&n>0?new Array(n).fill(0):null,g.attachDebugInfo(this,"effect",this.id)}run(){if(this.flags&E.DISPOSED)throw new D(l.EFFECT_DISPOSED);this.execute(!0)}dispose(){this.flags&E.DISPOSED||(this.flags|=E.DISPOSED,this._execCleanup(),this._releaseLinks(this._links),this._links=f,this._executeTask=void 0)}addDependency(t){if(!(this.flags&E.EXECUTING)||t._lastSeenEpoch===this._currentEpoch)return;t._lastSeenEpoch=this._currentEpoch;const e=this._nextLinks;if(t._tempUnsub){e.push(new x(t,t.version,t._tempUnsub)),t._tempUnsub=void 0;return}try{const s=t.subscribe(()=>{if(this._trackModifications&&this.flags&E.EXECUTING&&(t._modifiedAtEpoch=this._currentEpoch),this._sync)return this.execute();this._executeTask||(this._executeTask=()=>this.execute()),a.schedule(this._executeTask)});e.push(new x(t,t.version,s))}catch(s){console.error(N(s,D,l.EFFECT_EXECUTION_FAILED))}}execute(t=!1){if(this.flags&(E.DISPOSED|E.EXECUTING)||!t&&this._links.length>0&&!this._isDirty())return;this._checkInfiniteLoops(),this.flags|=E.EXECUTING,this._execCleanup();const e=this._links;if(e!==f)for(let r=0,h=e.length;r<h;r++){const u=e[r];u&&(u.node._tempUnsub=u.unsub)}const s=C.acquire();this._nextLinks=s,this._currentEpoch=Y();let n=!1;try{const r=T.run(this,this._fn);this._links=s,n=!0,this._checkLoopWarnings(),K(r)?this._handleAsyncResult(r):this._cleanup=typeof r=="function"?r:null}catch(r){n=!0,this._handleExecutionError(r),this._cleanup=null}finally{this._finalizeDependencies(n,e,s),this.flags&=-9}}_handleAsyncResult(t){const e=++this._execId;t.then(s=>{if(e!==this._execId||this.flags&E.DISPOSED){if(typeof s=="function")try{s()}catch(n){this._handleExecutionError(n,l.EFFECT_CLEANUP_FAILED)}return}typeof s=="function"&&(this._cleanup=s)},s=>e===this._execId&&this._handleExecutionError(s))}_finalizeDependencies(t,e,s){if(this._nextLinks=null,t){if(e!==f){for(let n=0,r=e.length;n<r;n++){const h=e[n],u=h?.node._tempUnsub;u&&(u(),h&&(h.node._tempUnsub=void 0))}C.release(e)}}else if(this._releaseLinks(s),C.release(s),e!==f)for(let n=0,r=e.length;n<r;n++)e[n]&&(e[n].node._tempUnsub=void 0)}_releaseLinks(t){if(t!==f){for(let e=0,s=t.length;e<s;e++)t[e]?.unsub?.();C.release(t)}}_isDirty(){const t=this._links;for(let e=0,s=t.length;e<s;e++){const n=t[e],r=n.node;if(r.version!==n.version)return!0;if("value"in r){try{J(()=>r.value)}catch{return!0}if(r.version!==n.version)return!0}}return!1}_execCleanup(){if(this._cleanup){try{this._cleanup()}catch(t){this._handleExecutionError(t,l.EFFECT_CLEANUP_FAILED)}this._cleanup=null}}_checkInfiniteLoops(){const t=v;if(this._lastFlushEpoch!==t&&(this._lastFlushEpoch=t,this._executionsInEpoch=0),++this._executionsInEpoch>this._maxExecutionsPerFlush&&this._throwInfiniteLoopError("per-effect"),ft()>p.MAX_EXECUTIONS_PER_FLUSH&&this._throwInfiniteLoopError("global"),this._executionCount++,this._history){const e=Date.now();this._history[this._historyPtr]=e,this._historyPtr=(this._historyPtr+1)%this._historyCapacity;const s=this._history[this._historyPtr]||0;if(s>0&&e-s<y.ONE_SECOND_MS){const n=new D("Effect executed too frequently within 1 second. Suspected infinite loop.");if(this.dispose(),this._handleExecutionError(n),_)throw n}}}get isDisposed(){return(this.flags&E.DISPOSED)!==0}get executionCount(){return this._executionCount}get isExecuting(){return(this.flags&E.EXECUTING)!==0}_throwInfiniteLoopError(t){const e=new D(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${w}`);throw this.dispose(),console.error(e),e}_handleExecutionError(t,e=l.EFFECT_EXECUTION_FAILED){const s=N(t,D,e);if(console.error(s),this._onError)try{this._onError(s)}catch(n){console.error(N(n,D,l.CALLBACK_ERROR_IN_ERROR_HANDLER))}}_checkLoopWarnings(){if(this._trackModifications&&g.enabled){const t=this._currentEpoch,e=this._links;for(let s=0,n=e.length;s<n;s++){const r=e[s].node;r._modifiedAtEpoch===t&&g.warn(!0,`Effect is reading a dependency (${g.getDebugName(r)||"unknown"}) that it just modified. Infinite loop may occur`)}}}}function bt(i,t={}){if(typeof i!="function")throw new D(l.EFFECT_MUST_BE_FUNCTION);const e=new Ct(i,t);return e.execute(),e}function Ot(i){if(typeof i!="function")throw new TypeError("Batch callback must be a function");a.startBatch();try{return i()}finally{a.endBatch()}}c.AsyncState=m,c.AtomError=O,c.ComputedError=I,c.DEBUG_CONFIG=k,c.DEBUG_RUNTIME=g,c.EffectError=D,c.POOL_CONFIG=rt,c.SCHEDULER_CONFIG=p,c.SchedulerError=R,c.atom=St,c.batch=Ot,c.computed=gt,c.effect=bt,c.isAtom=$,c.isComputed=It,c.isEffect=Dt,c.scheduler=a,c.untracked=J,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(h,b){typeof exports=="object"&&typeof module<"u"?b(exports):typeof define=="function"&&define.amd?define(["exports"],b):(h=typeof globalThis<"u"?globalThis:h||self,b(h.AtomEffect={}))})(this,(function(h){"use strict";const b={ONE_SECOND_MS:1e3},y={IDLE:"idle",PENDING:"pending",RESOLVED:"resolved",REJECTED:"rejected"},F={DISPOSED:1},E={...F,EXECUTING:8},o={...F,DIRTY:8,IDLE:16,PENDING:32,RESOLVED:64,REJECTED:128,RECOMPUTING:256,HAS_ERROR:512},D={...F,SYNC:8,NOTIFICATION_SCHEDULED:16},nt={MAX_SIZE:1e3,WARMUP_SIZE:100},p={MAX_EXECUTIONS_PER_SECOND:1e3,MAX_EXECUTIONS_PER_EFFECT:100,MAX_EXECUTIONS_PER_FLUSH:1e4,MAX_FLUSH_ITERATIONS:1e3,MIN_FLUSH_ITERATIONS:10,CLEANUP_THRESHOLD:1e3,BATCH_QUEUE_SHRINK_THRESHOLD:1e3},k={MAX_DEPENDENCIES:1e3,WARN_INFINITE_LOOP:!0},T=1073741823,l=typeof process<"u"&&process.env&&process.env.NODE_ENV!=="production"||typeof __DEV__<"u"&&!!__DEV__,rt=Object.freeze([]);class O extends Error{constructor(t,e=null,s=!0){super(t),this.cause=e,this.recoverable=s,this.timestamp=new Date,this.name="AtomError"}}class I extends O{constructor(t,e=null){super(t,e,!0),this.name="ComputedError"}}class S extends O{constructor(t,e=null){super(t,e,!1),this.name="EffectError"}}class A extends O{constructor(t,e=null){super(t,e,!1),this.name="SchedulerError"}}const V=Symbol("AtomEffect.DebugName"),ot=Symbol("AtomEffect.Id"),z=Symbol("AtomEffect.Type"),P=Symbol("AtomEffect.NoDefaultValue"),ct=i=>"dependencies"in i&&Array.isArray(i.dependencies);function X(i,t,e){if(i===t)throw new I("Circular dependency detected: The computation refers to itself explicitly or implicitly.");if(!e.has(i.id)&&(e.add(i.id),ct(i))){const s=i.dependencies;for(let n=0;n<s.length;n++){const r=s[n];r&&X(r,t,e)}}}const g={enabled:l,maxDependencies:k.MAX_DEPENDENCIES,warnInfiniteLoop:k.WARN_INFINITE_LOOP,warn(i,t){l&&this.enabled&&i&&console.warn(`[Atom Effect] ${t}`)},checkCircular(i,t){if(i===t)throw new I("Direct circular dependency detected");l&&this.enabled&&X(i,t,new Set)},attachDebugInfo(i,t,e){if(!l||!this.enabled)return;const s=i;s[V]=`${t}_${e}`,s[ot]=e,s[z]=t},getDebugName:i=>i?.[V],getDebugType:i=>i?.[z]};let ht=1;const ut=()=>ht++;function H(i,t,e){if(typeof t=="function"){const n=t;for(let r=0,c=e.length;r<c;r++){const u=e[r];if(u&&u.fn===n)return}e.push(new M(n,void 0));return}if("addDependency"in t){t.addDependency(i);return}const s=t;for(let n=0,r=e.length;n<r;n++){const c=e[n];if(c&&c.sub===s)return}e.push(new M(void 0,s))}function lt(i,t,e){for(let s=0,n=t.length;s<n;s++){const r=t[s];r&&(r.node._tempUnsub=r.unsub)}for(let s=0,n=i.length;s<n;s++){const r=i[s];if(!r)continue;const c=r.node;c._tempUnsub!==void 0?(r.unsub=c._tempUnsub,c._tempUnsub=void 0):(g.checkCircular(c,e),r.unsub=c.subscribe(e))}for(let s=0,n=t.length;s<n;s++){const r=t[s];if(r){const c=r.node;c._tempUnsub!==void 0&&(c._tempUnsub(),c._tempUnsub=void 0),r.unsub=void 0}}}class x{constructor(t,e,s=void 0){this.node=t,this.version=e,this.unsub=s}}class M{constructor(t,e){this.fn=t,this.sub=e}}const _={COMPUTED_MUST_BE_FUNCTION:"Computed target must be a function",COMPUTED_ASYNC_PENDING_NO_DEFAULT:"Async computation pending with no default value",COMPUTED_COMPUTATION_FAILED:"Computation execution failed",COMPUTED_ASYNC_COMPUTATION_FAILED:"Async computation execution failed",COMPUTED_CIRCULAR_DEPENDENCY:"Circular dependency detected",COMPUTED_DISPOSED:"Attempted to access disposed computed",ATOM_SUBSCRIBER_MUST_BE_FUNCTION:"Subscriber must be a function or Subscriber object",ATOM_INDIVIDUAL_SUBSCRIBER_FAILED:"Subscriber execution failed",EFFECT_MUST_BE_FUNCTION:"Effect target must be a function",EFFECT_EXECUTION_FAILED:"Effect execution failed",EFFECT_CLEANUP_FAILED:"Effect cleanup failed",EFFECT_DISPOSED:"Attempted to run disposed effect",CALLBACK_ERROR_IN_ERROR_HANDLER:"Exception encountered in onError handler"};function N(i,t,e){if(i instanceof O)return i;const s=i instanceof Error,n=s?i.message:String(i),r=s?i:void 0;let c="Unexpected error";i instanceof TypeError?c="Type error":i instanceof ReferenceError&&(c="Reference error");const u=`${c} (${e}): ${n}`;return new t(u,r)}class Y{constructor(){this.flags=0,this.version=0,this._lastSeenEpoch=-1,this._modifiedAtEpoch=-1,this.id=ut()&T,this._tempUnsub=void 0}}class Q extends Y{subscribe(t){const e=typeof t=="function";if(!e&&(!t||typeof t.execute!="function"))throw N(new TypeError("Invalid subscriber"),O,_.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);const s=this._subscribers;for(let r=0,c=s.length;r<c;r++){const u=s[r];if(u&&(e?u.fn===t:u.sub===t))return l&&console.warn("Duplicate subscription ignored."),()=>{}}const n=new M(e?t:void 0,e?void 0:t);return s.push(n),()=>this._unsubscribe(n)}_unsubscribe(t){const e=this._subscribers,s=e.indexOf(t);if(s===-1)return;const n=e.pop();s<e.length&&n&&(e[s]=n)}subscriberCount(){return this._subscribers.length}_notifySubscribers(t,e){if(this._subscribers.length===0)return;const s=[...this._subscribers],n=s.length;for(let r=0;r<n;r++){const c=s[r];if(c)try{c.fn?c.fn(t,e):c.sub&&c.sub.execute()}catch(u){this._handleNotifyError(u)}}}_handleNotifyError(t){console.error(N(t,O,_.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED))}}let R=0;const j=()=>(R=R+1&T||1,R),_t=()=>R;let v=0,w=0,U=!1;function q(){return U?(l&&console.warn("startFlush() called during flush - ignored"),!1):(U=!0,v=v+1&T||1,w=0,!0)}const $=()=>{U=!1},at=()=>U?++w:0,a={_queueBuffer:[[],[]],_bufferIndex:0,_size:0,_epoch:0,_isProcessing:!1,_isBatching:!1,_isFlushingSync:!1,_batchDepth:0,_batchQueue:[],_batchQueueSize:0,_maxFlushIterations:p.MAX_FLUSH_ITERATIONS,get phase(){return this._isProcessing||this._isFlushingSync?2:this._isBatching?1:0},get queueSize(){return this._size},get isBatching(){return this._isBatching},schedule(i){if(l&&typeof i!="function")throw new A("Scheduler callback must be a function");if(i._nextEpoch!==this._epoch){if(i._nextEpoch=this._epoch,this._isBatching||this._isFlushingSync){this._batchQueue[this._batchQueueSize++]=i;return}this._queueBuffer[this._bufferIndex][this._size++]=i,this._isProcessing||this._flush()}},_flush(){this._isProcessing||this._size===0||(this._isProcessing=!0,queueMicrotask(this._runLoop))},_runLoop:()=>{try{if(a._size===0)return;const i=q();a._drainQueue(),i&&$()}finally{a._isProcessing=!1,a._size>0&&!a._isBatching&&a._flush()}},_flushSync(){this._isFlushingSync=!0;const i=q();try{this._mergeBatchQueue(),this._drainQueue()}finally{this._isFlushingSync=!1,i&&$()}},_mergeBatchQueue(){if(this._batchQueueSize===0)return;const i=++this._epoch,t=this._batchQueue,e=this._queueBuffer[this._bufferIndex];let s=this._size;for(let n=0;n<this._batchQueueSize;n++){const r=t[n];r._nextEpoch!==i&&(r._nextEpoch=i,e[s++]=r)}this._size=s,this._batchQueueSize=0,t.length>p.BATCH_QUEUE_SHRINK_THRESHOLD&&(t.length=0)},_drainQueue(){let i=0;for(;this._size>0;){if(++i>this._maxFlushIterations){this._handleFlushOverflow();return}this._processQueue(),this._mergeBatchQueue()}},_processQueue(){const i=this._bufferIndex,t=this._queueBuffer[i],e=this._size;this._bufferIndex=i^1,this._size=0,this._epoch++;for(let s=0;s<e;s++)try{t[s]()}catch(n){console.error(new A("Error occurred during scheduler execution",n))}t.length=0},_handleFlushOverflow(){console.error(new A(`Maximum flush iterations (${this._maxFlushIterations}) exceeded. Possible infinite loop.`)),this._size=0,this._queueBuffer[this._bufferIndex].length=0,this._batchQueueSize=0},startBatch(){this._batchDepth++,this._isBatching=!0},endBatch(){if(this._batchDepth===0){l&&console.warn("endBatch() called without matching startBatch(). Ignoring.");return}--this._batchDepth===0&&(this._flushSync(),this._isBatching=!1)},setMaxFlushIterations(i){if(i<p.MIN_FLUSH_ITERATIONS)throw new A(`Max flush iterations must be at least ${p.MIN_FLUSH_ITERATIONS}`);this._maxFlushIterations=i}},d={current:null,run(i,t){const e=this.current;this.current=i;try{return t()}finally{this.current=e}}};function ft(i){const t=d.current;if(t===null)return i();d.current=null;try{return i()}finally{d.current=t}}class Et extends Q{constructor(t,e){super(),this._pendingOldValue=void 0,this._notifyTask=void 0,this._subscribers=[],this._value=t,e&&(this.flags|=D.SYNC),g.attachDebugInfo(this,"atom",this.id)}get value(){const t=d.current;return t&&H(this,t,this._subscribers),this._value}set value(t){const e=this._value;if(Object.is(e,t))return;this._value=t,this.version=this.version+1&T;const s=this.flags;if(!(this._subscribers.length===0||s&D.NOTIFICATION_SCHEDULED)){if(this._pendingOldValue=e,this.flags=s|D.NOTIFICATION_SCHEDULED,s&D.SYNC&&!a.isBatching){this._flushNotifications();return}this._notifyTask||(this._notifyTask=()=>this._flushNotifications()),a.schedule(this._notifyTask)}}_flushNotifications(){const t=this.flags;if(!(t&D.NOTIFICATION_SCHEDULED)||t&D.DISPOSED)return;const e=this._pendingOldValue;this._pendingOldValue=void 0,this.flags&=-17,this._notifySubscribers(this._value,e)}peek(){return this._value}dispose(){this.flags&D.DISPOSED||(this._subscribers.length=0,this.flags|=D.DISPOSED,this._value=void 0,this._pendingOldValue=void 0,this._notifyTask=void 0)}}function dt(i,t={}){return new Et(i,t.sync??!1)}class pt{constructor(t=50,e=256){this.limit=t,this.capacity=e,this.pool=[],this.stats=l?{acquired:0,released:0,rejected:{frozen:0,tooLarge:0,poolFull:0}}:null}acquire(){return l&&this.stats&&this.stats.acquired++,this.pool.pop()??[]}release(t,e){if(!(e&&t===e)){if(t.length>this.capacity){l&&this.stats&&this.stats.rejected.tooLarge++;return}if(this.pool.length>=this.limit){l&&this.stats&&this.stats.rejected.poolFull++;return}if(Object.isFrozen(t)){l&&this.stats&&this.stats.rejected.frozen++;return}t.length=0,this.pool.push(t),l&&this.stats&&this.stats.released++}}getStats(){if(!l||!this.stats)return null;const{acquired:t,released:e,rejected:s}=this.stats,n=t-e-(s.frozen+s.tooLarge+s.poolFull);return{acquired:t,released:e,rejected:{...s},leaked:n,poolSize:this.pool.length}}reset(){this.pool.length=0,l&&this.stats&&(this.stats={acquired:0,released:0,rejected:{frozen:0,tooLarge:0,poolFull:0}})}}const m=i=>Object.freeze(i);m([]),m([]),m([]),m([]);const f=m([]),C=new pt;function J(i){return i!==null&&typeof i=="object"&&"value"in i&&typeof i.subscribe=="function"}function It(i){return J(i)&&typeof i.invalidate=="function"}function Dt(i){return i!==null&&typeof i=="object"&&typeof i.dispose=="function"&&typeof i.run=="function"}function K(i){return i!==null&&typeof i=="object"&&typeof i.then=="function"}const W=o.RESOLVED|o.PENDING|o.REJECTED,L=Array(W+1).fill(y.IDLE);L[o.RESOLVED]=y.RESOLVED,L[o.PENDING]=y.PENDING,L[o.REJECTED]=y.REJECTED;const Z=3,tt=Number.MAX_SAFE_INTEGER-1;class et extends Q{constructor(t,e={}){if(typeof t!="function")throw new I(_.COMPUTED_MUST_BE_FUNCTION);if(super(),this._error=null,this._promiseId=0,this._subscribers=[],this._links=f,this._cachedErrors=null,this._errorCacheEpoch=-1,this._asyncStartAggregateVersion=0,this._asyncRetryCount=0,this._trackEpoch=-1,this._trackLinks=f,this._trackCount=0,this._value=void 0,this.flags=o.DIRTY|o.IDLE,this._equal=e.equal??Object.is,this._fn=t,this._defaultValue="defaultValue"in e?e.defaultValue:P,this._onError=e.onError??null,g.attachDebugInfo(this,"computed",this.id),e.lazy===!1)try{this._recompute()}catch{}}_track(){const t=d.current;t&&H(this,t,this._subscribers)}get value(){this._track();const t=this.flags;if((t&(o.RESOLVED|o.DIRTY|o.IDLE))===o.RESOLVED)return this._value;if(t&o.DISPOSED)throw new I(_.COMPUTED_DISPOSED);if(t&o.RECOMPUTING){if(this._defaultValue!==P)return this._defaultValue;throw new I(_.COMPUTED_CIRCULAR_DEPENDENCY)}if(t&(o.DIRTY|o.IDLE)&&(this._recompute(),this.flags&o.RESOLVED))return this._value;const e=this._defaultValue,s=e!==P;if(this.flags&o.PENDING){if(s)return e;throw new I(_.COMPUTED_ASYNC_PENDING_NO_DEFAULT)}if(this.flags&o.REJECTED){if(this._error?.recoverable&&s)return e;throw this._error}return this._value}peek(){return this._value}get state(){return this._track(),L[this.flags&W]}get hasError(){if(this._track(),this.flags&(o.REJECTED|o.HAS_ERROR))return!0;const t=this._links;for(let e=0,s=t.length;e<s;e++){const n=t[e]?.node;if(n&&n.flags&o.HAS_ERROR)return!0}return!1}get isValid(){return!this.hasError}get errors(){if(this._track(),!this.hasError)return rt;const t=_t();if(this._errorCacheEpoch===t&&this._cachedErrors)return this._cachedErrors;const e=[];this._error&&e.push(this._error);const s=this._links;for(let r=0,c=s.length;r<c;r++){const u=s[r].node;if(u.flags&o.HAS_ERROR){const st=u;if(st.errors){const it=st.errors;for(let B=0;B<it.length;B++){const G=it[B];G&&e.indexOf(G)===-1&&e.push(G)}}}}const n=Object.freeze(e);return this._errorCacheEpoch=t,this._cachedErrors=n,n}get lastError(){return this._track(),this._error}get isPending(){return this._track(),(this.flags&o.PENDING)!==0}get isResolved(){return this._track(),(this.flags&o.RESOLVED)!==0}invalidate(){this._markDirty(),this._errorCacheEpoch=-1,this._cachedErrors=null}dispose(){if(this.flags&o.DISPOSED)return;const t=this._links;if(t!==f){for(let e=0,s=t.length;e<s;e++)t[e].unsub?.();C.release(t),this._links=f}this._subscribers.length=0,this.flags=o.DISPOSED|o.DIRTY|o.IDLE,this._error=null,this._value=void 0,this._promiseId=(this._promiseId+1)%tt,this._cachedErrors=null,this._errorCacheEpoch=-1}addDependency(t){if(t._lastSeenEpoch!==this._trackEpoch){if(t._lastSeenEpoch=this._trackEpoch,this._trackCount<this._trackLinks.length){const e=this._trackLinks[this._trackCount];e.node=t,e.version=t.version}else this._trackLinks.push(new x(t,t.version));this._trackCount++}}_commitDeps(t){this._trackLinks.length=this._trackCount,lt(this._trackLinks,t,this),this._links=this._trackLinks}_recompute(){if(this.flags&o.RECOMPUTING)return;this.flags|=o.RECOMPUTING;const t=this._links;this._trackEpoch=j(),this._trackLinks=C.acquire(),this._trackCount=0;let e=!1;try{const s=d.run(this,this._fn);this._commitDeps(t),e=!0,K(s)?this._handleAsyncComputation(s):this._finalizeResolution(s)}catch(s){if(!e)try{this._commitDeps(t),e=!0}catch{}this._handleError(s,_.COMPUTED_COMPUTATION_FAILED,!0)}finally{e&&t!==f?C.release(t):e||C.release(this._trackLinks),this._trackEpoch=-1,this._trackLinks=f,this._trackCount=0,this.flags&=-257}}_handleAsyncComputation(t){this.flags=(this.flags|o.PENDING)&-217,this._notifySubscribers(void 0,void 0),this._asyncStartAggregateVersion=this._captureVersionSnapshot(),this._asyncRetryCount=0,this._promiseId=(this._promiseId+1)%tt;const e=this._promiseId;t.then(s=>{if(e===this._promiseId){if(this._captureVersionSnapshot()!==this._asyncStartAggregateVersion)return this._asyncRetryCount++<Z?this._markDirty():this._handleError(new I(`Async drift threshold exceeded after ${Z} retries.`),_.COMPUTED_ASYNC_COMPUTATION_FAILED);this._finalizeResolution(s),this._notifySubscribers(s,void 0)}},s=>e===this._promiseId&&this._handleError(s,_.COMPUTED_ASYNC_COMPUTATION_FAILED))}_captureVersionSnapshot(){let t=0;const e=this._links;for(let s=0,n=e.length;s<n;s++)t=((t<<5)-t|0)+e[s].node.version&T;return t}_handleError(t,e,s=!1){const n=N(t,I,e);if(!s&&!(this.flags&o.REJECTED)&&(this.version=this.version+1&T),this._error=n,this.flags=this.flags&-121|(o.REJECTED|o.HAS_ERROR),this._onError)try{this._onError(n)}catch(r){console.error(_.CALLBACK_ERROR_IN_ERROR_HANDLER,r)}if(s)throw n;this._notifySubscribers(void 0,void 0)}_finalizeResolution(t){(!(this.flags&o.RESOLVED)||!this._equal(this._value,t))&&(this.version=this.version+1&T),this._value=t,this._error=null,this.flags=(this.flags|o.RESOLVED)&-697,this._cachedErrors=null,this._errorCacheEpoch=-1}execute(){this._markDirty()}_markDirty(){this.flags&(o.RECOMPUTING|o.DIRTY)||(this.flags|=o.DIRTY,this._notifySubscribers(void 0,void 0))}}Object.freeze(et.prototype);function St(i,t={}){return new et(i,t)}class gt extends Y{constructor(t,e={}){super(),this._cleanup=null,this._links=f,this._nextLinks=null,this._currentEpoch=-1,this._lastFlushEpoch=-1,this._executionsInEpoch=0,this._executionCount=0,this._historyPtr=0,this._execId=0,this._fn=t,this._onError=e.onError??null,this._sync=e.sync??!1,this._maxExecutions=e.maxExecutionsPerSecond??p.MAX_EXECUTIONS_PER_SECOND,this._maxExecutionsPerFlush=e.maxExecutionsPerFlush??p.MAX_EXECUTIONS_PER_EFFECT,this._trackModifications=e.trackModifications??!1;const s=Number.isFinite(this._maxExecutions),n=s?Math.min(this._maxExecutions+1,p.MAX_EXECUTIONS_PER_SECOND+1):0;this._historyCapacity=n,this._history=l&&s&&n>0?new Array(n).fill(0):null,g.attachDebugInfo(this,"effect",this.id)}run(){if(this.flags&E.DISPOSED)throw new S(_.EFFECT_DISPOSED);this.execute(!0)}dispose(){this.flags&E.DISPOSED||(this.flags|=E.DISPOSED,this._execCleanup(),this._releaseLinks(this._links),this._links=f,this._executeTask=void 0)}addDependency(t){if(!(this.flags&E.EXECUTING)||t._lastSeenEpoch===this._currentEpoch)return;t._lastSeenEpoch=this._currentEpoch;const e=this._nextLinks;if(t._tempUnsub){e.push(new x(t,t.version,t._tempUnsub)),t._tempUnsub=void 0;return}try{const s=t.subscribe(()=>{if(this._trackModifications&&this.flags&E.EXECUTING&&(t._modifiedAtEpoch=this._currentEpoch),this._sync)return this.execute();this._executeTask||(this._executeTask=()=>this.execute()),a.schedule(this._executeTask)});e.push(new x(t,t.version,s))}catch(s){console.error(N(s,S,_.EFFECT_EXECUTION_FAILED))}}execute(t=!1){if(this.flags&(E.DISPOSED|E.EXECUTING)||!t&&this._links.length>0&&!this._isDirty())return;this._checkInfiniteLoops(),this.flags|=E.EXECUTING,this._execCleanup();const e=this._links;if(e!==f)for(let r=0,c=e.length;r<c;r++){const u=e[r];u&&(u.node._tempUnsub=u.unsub)}const s=C.acquire();this._nextLinks=s,this._currentEpoch=j();let n=!1;try{const r=d.run(this,this._fn);this._links=s,n=!0,this._checkLoopWarnings(),K(r)?this._handleAsyncResult(r):this._cleanup=typeof r=="function"?r:null}catch(r){n=!0,this._handleExecutionError(r),this._cleanup=null}finally{this._finalizeDependencies(n,e,s),this.flags&=-9}}_handleAsyncResult(t){const e=++this._execId;t.then(s=>{if(e!==this._execId||this.flags&E.DISPOSED){if(typeof s=="function")try{s()}catch(n){this._handleExecutionError(n,_.EFFECT_CLEANUP_FAILED)}return}typeof s=="function"&&(this._cleanup=s)},s=>e===this._execId&&this._handleExecutionError(s))}_finalizeDependencies(t,e,s){if(this._nextLinks=null,t){if(e!==f){for(let n=0,r=e.length;n<r;n++){const c=e[n],u=c?.node._tempUnsub;u&&(u(),c&&(c.node._tempUnsub=void 0))}C.release(e)}}else if(this._releaseLinks(s),C.release(s),e!==f)for(let n=0,r=e.length;n<r;n++)e[n]&&(e[n].node._tempUnsub=void 0)}_releaseLinks(t){if(t!==f){for(let e=0,s=t.length;e<s;e++)t[e]?.unsub?.();C.release(t)}}_isDirty(){const t=this._links,e=d.current;d.current=null;try{for(let s=0,n=t.length;s<n;s++){const r=t[s],c=r.node;if(c.version!==r.version)return!0;if("value"in c){try{c.value}catch{return!0}if(c.version!==r.version)return!0}}return!1}finally{d.current=e}}_execCleanup(){if(this._cleanup){try{this._cleanup()}catch(t){this._handleExecutionError(t,_.EFFECT_CLEANUP_FAILED)}this._cleanup=null}}_checkInfiniteLoops(){const t=v;if(this._lastFlushEpoch!==t&&(this._lastFlushEpoch=t,this._executionsInEpoch=0),++this._executionsInEpoch>this._maxExecutionsPerFlush&&this._throwInfiniteLoopError("per-effect"),at()>p.MAX_EXECUTIONS_PER_FLUSH&&this._throwInfiniteLoopError("global"),this._executionCount++,this._history){const e=Date.now();this._history[this._historyPtr]=e,this._historyPtr=(this._historyPtr+1)%this._historyCapacity;const s=this._history[this._historyPtr]||0;if(s>0&&e-s<b.ONE_SECOND_MS){const n=new S("Effect executed too frequently within 1 second. Suspected infinite loop.");if(this.dispose(),this._handleExecutionError(n),l)throw n}}}get isDisposed(){return(this.flags&E.DISPOSED)!==0}get executionCount(){return this._executionCount}get isExecuting(){return(this.flags&E.EXECUTING)!==0}_throwInfiniteLoopError(t){const e=new S(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${w}`);throw this.dispose(),console.error(e),e}_handleExecutionError(t,e=_.EFFECT_EXECUTION_FAILED){const s=N(t,S,e);if(console.error(s),this._onError)try{this._onError(s)}catch(n){console.error(N(n,S,_.CALLBACK_ERROR_IN_ERROR_HANDLER))}}_checkLoopWarnings(){if(this._trackModifications&&g.enabled){const t=this._currentEpoch,e=this._links;for(let s=0,n=e.length;s<n;s++){const r=e[s].node;r._modifiedAtEpoch===t&&g.warn(!0,`Effect is reading a dependency (${g.getDebugName(r)||"unknown"}) that it just modified. Infinite loop may occur`)}}}}function Ct(i,t={}){if(typeof i!="function")throw new S(_.EFFECT_MUST_BE_FUNCTION);const e=new gt(i,t);return e.execute(),e}function Tt(i){if(typeof i!="function")throw new TypeError("Batch callback must be a function");a.startBatch();try{return i()}finally{a.endBatch()}}h.AsyncState=y,h.AtomError=O,h.ComputedError=I,h.DEBUG_CONFIG=k,h.DEBUG_RUNTIME=g,h.EffectError=S,h.POOL_CONFIG=nt,h.SCHEDULER_CONFIG=p,h.SchedulerError=A,h.atom=dt,h.batch=Tt,h.computed=St,h.effect=Ct,h.isAtom=J,h.isComputed=It,h.isEffect=Dt,h.scheduler=a,h.untracked=ft,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=atom-effect.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atom-effect.min.js","sources":["../src/constants.ts","../src/errors/errors.ts","../src/utils/debug.ts","../src/core/dep-tracking.ts","../src/errors/messages.ts","../src/utils/error.ts","../src/core/base.ts","../src/internal/epoch.ts","../src/internal/scheduler.ts","../src/tracking/context.ts","../src/tracking/untracked.ts","../src/core/atom.ts","../src/utils/array-pool.ts","../src/internal/pool.ts","../src/utils/type-guards.ts","../src/core/computed.ts","../src/core/effect.ts","../src/internal/batch.ts"],"sourcesContent":["/**\n * Global time constants.\n * Used for debouncing, throttling, and scheduling.\n */\nexport const TIME_CONSTANTS = {\n ONE_SECOND_MS: 1000,\n} as const;\n\n/**\n * Async operation states.\n */\nexport const AsyncState = {\n IDLE: 'idle',\n PENDING: 'pending',\n RESOLVED: 'resolved',\n REJECTED: 'rejected',\n} as const;\n\n/**\n * Base Node Flags.\n */\nexport const NODE_FLAGS = {\n DISPOSED: 1 << 0,\n HAS_FN_SUBS: 1 << 1,\n HAS_OBJ_SUBS: 1 << 2,\n} as const;\n\n/**\n * Effect flags.\n */\nexport const EFFECT_STATE_FLAGS = {\n ...NODE_FLAGS,\n EXECUTING: 1 << 3,\n} as const;\n\n/**\n * Computed flags.\n */\nexport const COMPUTED_STATE_FLAGS = {\n ...NODE_FLAGS,\n DIRTY: 1 << 3,\n IDLE: 1 << 4,\n PENDING: 1 << 5,\n RESOLVED: 1 << 6,\n REJECTED: 1 << 7,\n RECOMPUTING: 1 << 8,\n HAS_ERROR: 1 << 9,\n} as const;\n\n/**\n * Writable Atom Flags.\n */\nexport const ATOM_STATE_FLAGS = {\n ...NODE_FLAGS,\n SYNC: 1 << 3,\n NOTIFICATION_SCHEDULED: 1 << 4,\n} as const;\n\n/**\n * Array pool configuration.\n */\nexport const POOL_CONFIG = {\n MAX_SIZE: 1000,\n WARMUP_SIZE: 100,\n} as const;\n\n/**\n * Scheduler configuration.\n */\nexport const SCHEDULER_CONFIG = {\n // Infinite loop protection\n MAX_EXECUTIONS_PER_SECOND: 1000,\n MAX_EXECUTIONS_PER_EFFECT: 100,\n\n // Batch processing limits to prevent blocking the main thread for too long\n MAX_EXECUTIONS_PER_FLUSH: 10000,\n MAX_FLUSH_ITERATIONS: 1000,\n MIN_FLUSH_ITERATIONS: 10,\n\n // Memory management\n CLEANUP_THRESHOLD: 1000,\n BATCH_QUEUE_SHRINK_THRESHOLD: 1000,\n} as const;\n\n/**\n * Debugging thresholds.\n */\nexport const DEBUG_CONFIG = {\n MAX_DEPENDENCIES: 1000,\n WARN_INFINITE_LOOP: true,\n} as const;\n\n/**\n * V8 Small Integer (SMI) max value.\n */\nexport const SMI_MAX = 0x3fffffff;\n\n/**\n * Development environment flag.\n */\nexport const IS_DEV =\n (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production') ||\n (typeof __DEV__ !== 'undefined' && !!__DEV__);\n\n// Fallback declaration for __DEV__ if not present in environment\ndeclare const __DEV__: boolean;\n\nexport const EMPTY_ERROR_ARRAY: readonly Error[] = Object.freeze([]);\n","/**\n * Base error class.\n */\nexport class AtomError extends Error {\n readonly timestamp = new Date();\n\n constructor(\n message: string,\n public cause: Error | null = null,\n public recoverable = true\n ) {\n super(message);\n this.name = 'AtomError';\n }\n}\n\n/** Computed error. */\nexport class ComputedError extends AtomError {\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, true);\n this.name = 'ComputedError';\n }\n}\n\n/** Effect error. */\nexport class EffectError extends AtomError {\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, false);\n this.name = 'EffectError';\n }\n}\n\n/** Scheduler error. */\nexport class SchedulerError extends AtomError {\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, false);\n this.name = 'SchedulerError';\n }\n}\n","import { DEBUG_CONFIG, IS_DEV } from '@/constants';\nimport { ComputedError } from '@/errors/errors';\nimport type { DebugConfig, Dependency, DependencyId } from '@/types';\n\n// Debug symbols\nexport const DEBUG_NAME = Symbol('AtomEffect.DebugName');\nexport const DEBUG_ID = Symbol('AtomEffect.Id');\nexport const DEBUG_TYPE = Symbol('AtomEffect.Type');\nexport const NO_DEFAULT_VALUE = Symbol('AtomEffect.NoDefaultValue');\n\n/**\n * Dependency type guard.\n */\nconst hasDeps = (o: Dependency): o is Dependency & { dependencies: Dependency[] } =>\n 'dependencies' in o && Array.isArray((o as { dependencies: unknown }).dependencies);\n\n/**\n * Cycle detection.\n */\nfunction checkCircularInternal(dep: Dependency, current: object, visited: Set<number>): void {\n // Cycle detected in *this* path\n if (dep === current) {\n throw new ComputedError(\n 'Circular dependency detected: The computation refers to itself explicitly or implicitly.'\n );\n }\n\n // Cycle check\n if (visited.has(dep.id)) return;\n visited.add(dep.id);\n\n if (hasDeps(dep)) {\n const deps = dep.dependencies;\n // Check dependencies\n for (let i = 0; i < deps.length; i++) {\n const child = deps[i];\n if (child) {\n checkCircularInternal(child, current, visited);\n }\n }\n }\n}\n\n/**\n * Debug controller.\n */\nexport const debug: DebugConfig = {\n // Dev mode flag\n enabled: IS_DEV,\n\n maxDependencies: DEBUG_CONFIG.MAX_DEPENDENCIES,\n warnInfiniteLoop: DEBUG_CONFIG.WARN_INFINITE_LOOP,\n\n warn(cond, msg) {\n if (IS_DEV && this.enabled && cond) {\n console.warn(`[Atom Effect] ${msg}`);\n }\n },\n\n checkCircular(dep, current) {\n if (dep === current) {\n throw new ComputedError('Direct circular dependency detected');\n }\n\n if (IS_DEV && this.enabled) {\n checkCircularInternal(dep, current, new Set());\n }\n },\n\n attachDebugInfo(obj, type, id) {\n if (!IS_DEV || !this.enabled) return;\n\n const t = obj as Record<symbol, unknown>;\n t[DEBUG_NAME] = `${type}_${id}`;\n t[DEBUG_ID] = id;\n t[DEBUG_TYPE] = type;\n },\n\n getDebugName: (obj) =>\n (obj as Record<symbol, unknown> | null)?.[DEBUG_NAME] as string | undefined,\n\n getDebugType: (obj) =>\n (obj as Record<symbol, unknown> | null)?.[DEBUG_TYPE] as string | undefined,\n};\n\n/**\n * ID counter.\n */\nlet nextId = 1;\n\n/**\n * Generates ID.\n */\nexport const generateId = () => nextId++ as DependencyId;\n","import { NODE_FLAGS } from '@/constants';\nimport type { DependencySubscriber, Listener } from '@/tracking/tracking.types';\nimport type { Dependency, Subscriber } from '@/types';\nimport { debug } from '@/utils/debug';\n/**\n * Tracks dependency.\n */\nexport function trackDependency<T>(\n dependency: Dependency,\n current: Listener,\n subscribers: SubscriberLink<T>[]\n): void {\n if (typeof current === 'function') {\n const fn = current as (newValue?: T, oldValue?: T) => void;\n // Check for existing subscription\n for (let i = 0, len = subscribers.length; i < len; i++) {\n const link = subscribers[i];\n if (link && link.fn === fn) return;\n }\n subscribers.push(new SubscriberLink(fn, undefined));\n dependency.flags |= NODE_FLAGS.HAS_FN_SUBS;\n if ('_fnSubCount' in dependency) {\n (dependency as unknown as { _fnSubCount: number })._fnSubCount++;\n }\n return;\n }\n\n if ('addDependency' in (current as object)) {\n (current as DependencySubscriber).addDependency(dependency);\n return;\n }\n\n const sub = current as Subscriber;\n for (let i = 0, len = subscribers.length; i < len; i++) {\n const link = subscribers[i];\n if (link && link.sub === sub) return;\n }\n subscribers.push(new SubscriberLink(undefined, sub));\n dependency.flags |= NODE_FLAGS.HAS_OBJ_SUBS;\n if ('_objSubCount' in dependency) {\n (dependency as unknown as { _objSubCount: number })._objSubCount++;\n }\n}\n\n/**\n * Syncs dependencies.\n */\nexport function syncDependencies(\n nextLinks: DependencyLink[],\n prevLinks: DependencyLink[],\n tracker: Subscriber\n): void {\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n const link = prevLinks[i];\n if (link) {\n link.node._tempUnsub = link.unsub;\n }\n }\n\n for (let i = 0, len = nextLinks.length; i < len; i++) {\n const link = nextLinks[i];\n if (!link) continue;\n\n const node = link.node;\n if (node._tempUnsub !== undefined) {\n // Re-link: Found in previous set, reclaim the subscription\n link.unsub = node._tempUnsub;\n node._tempUnsub = undefined; // Consumed\n } else {\n // New Link: Subscribe afresh\n debug.checkCircular(node, tracker);\n link.unsub = node.subscribe(tracker);\n }\n }\n\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n const link = prevLinks[i];\n if (link) {\n const node = link.node;\n if (node._tempUnsub !== undefined) {\n node._tempUnsub(); // Release\n node._tempUnsub = undefined;\n }\n link.unsub = undefined;\n }\n }\n}\n\n/**\n * Dependency graph edge.\n */\nexport class DependencyLink {\n constructor(\n public node: Dependency,\n public version: number,\n public unsub: (() => void) | undefined = undefined\n ) {}\n}\n\n/**\n * Subscriber link.\n */\nexport class SubscriberLink<T> {\n constructor(\n public fn: ((newValue?: T, oldValue?: T) => void) | undefined,\n public sub: Subscriber | undefined\n ) {}\n}\n","/**\n * Error message registry.\n */\nexport const ERROR_MESSAGES = {\n // Computed Errors\n COMPUTED_MUST_BE_FUNCTION: 'Computed target must be a function',\n COMPUTED_ASYNC_PENDING_NO_DEFAULT: 'Async computation pending with no default value',\n COMPUTED_COMPUTATION_FAILED: 'Computation execution failed',\n COMPUTED_ASYNC_COMPUTATION_FAILED: 'Async computation execution failed',\n COMPUTED_CIRCULAR_DEPENDENCY: 'Circular dependency detected',\n COMPUTED_DISPOSED: 'Attempted to access disposed computed',\n\n // Atom Errors\n ATOM_SUBSCRIBER_MUST_BE_FUNCTION: 'Subscriber must be a function or Subscriber object',\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: 'Subscriber execution failed',\n\n // Effect Errors\n EFFECT_MUST_BE_FUNCTION: 'Effect target must be a function',\n EFFECT_EXECUTION_FAILED: 'Effect execution failed',\n EFFECT_CLEANUP_FAILED: 'Effect cleanup failed',\n EFFECT_DISPOSED: 'Attempted to run disposed effect',\n\n // System / Debug\n LARGE_DEPENDENCY_GRAPH: (count: number): string => `Large dependency graph (${count} nodes)`,\n CALLBACK_ERROR_IN_ERROR_HANDLER: 'Exception encountered in onError handler',\n} as const;\n","import { AtomError } from '@/errors/errors';\n\n/**\n * Wraps error.\n *\n * @param error - Raw error.\n * @param ErrorClass - Error class.\n * @param context - Error context.\n */\nexport function wrapError(\n error: unknown,\n ErrorClass: typeof AtomError,\n context: string\n): AtomError {\n // Return if wrapped\n if (error instanceof AtomError) {\n return error;\n }\n\n const isNativeError = error instanceof Error;\n const originalMessage = isNativeError ? error.message : String(error);\n const cause = isNativeError ? error : undefined;\n\n // Error category\n let type = 'Unexpected error';\n if (error instanceof TypeError) type = 'Type error';\n else if (error instanceof ReferenceError) type = 'Reference error';\n\n const finalMessage = `${type} (${context}): ${originalMessage}`;\n\n return new ErrorClass(finalMessage, cause);\n}\n","import { IS_DEV, NODE_FLAGS, SMI_MAX } from '@/constants';\nimport { SubscriberLink } from '@/core/dep-tracking';\nimport { AtomError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport type { DependencyId, Subscriber } from '@/types';\nimport { generateId } from '@/utils/debug';\nimport { wrapError } from '@/utils/error';\n\n/**\n * Base class for all reactive nodes.\n */\nexport class ReactiveNode {\n /** State flags */\n flags = 0;\n /** Version counter */\n version = 0;\n /** Last access epoch */\n _lastSeenEpoch = -1;\n /** Modified epoch */\n _modifiedAtEpoch = -1;\n /** Debug ID */\n readonly id: DependencyId = (generateId() & SMI_MAX) as DependencyId;\n /** Temporary unsubscribe slot */\n _tempUnsub: (() => void) | undefined = undefined;\n}\n\n/**\n * Reactive dependency base class.\n */\nexport abstract class ReactiveDependency<T> extends ReactiveNode {\n protected abstract _subscribers: SubscriberLink<T>[];\n\n /** @internal */\n public _fnSubCount = 0;\n /** @internal */\n public _objSubCount = 0;\n\n /**\n * Adds subscriber.\n */\n subscribe(listener: ((newValue?: T, oldValue?: T) => void) | Subscriber): () => void {\n const isFn = typeof listener === 'function';\n // Validate subscriber\n if (!isFn && (!listener || typeof (listener as Subscriber).execute !== 'function')) {\n throw wrapError(\n new TypeError('Invalid subscriber'),\n AtomError,\n ERROR_MESSAGES.ATOM_SUBSCRIBER_MUST_BE_FUNCTION\n );\n }\n\n const subs = this._subscribers;\n for (let i = 0, len = subs.length; i < len; i++) {\n const sub = subs[i];\n if (!sub) continue;\n if (isFn ? sub.fn === listener : sub.sub === listener) {\n if (IS_DEV) console.warn('Duplicate subscription ignored.');\n return () => {};\n }\n }\n\n const link = new SubscriberLink<T>(\n isFn ? (listener as (newValue?: T, oldValue?: T) => void) : undefined,\n !isFn ? (listener as Subscriber) : undefined\n );\n\n subs.push(link);\n if (isFn) {\n this._fnSubCount++;\n this.flags |= NODE_FLAGS.HAS_FN_SUBS;\n } else {\n this._objSubCount++;\n this.flags |= NODE_FLAGS.HAS_OBJ_SUBS;\n }\n\n return () => this._unsubscribe(link);\n }\n\n private _unsubscribe(link: SubscriberLink<T>): void {\n const subs = this._subscribers;\n const idx = subs.indexOf(link);\n if (idx === -1) return;\n\n // Remove subscriber\n const last = subs.pop();\n if (idx < subs.length && last) {\n subs[idx] = last;\n }\n\n if (link.fn) {\n this._fnSubCount--;\n } else {\n this._objSubCount--;\n }\n\n if (subs.length === 0) {\n this.flags &= ~(NODE_FLAGS.HAS_FN_SUBS | NODE_FLAGS.HAS_OBJ_SUBS);\n this._fnSubCount = 0;\n this._objSubCount = 0;\n } else if (link.fn && this._fnSubCount <= 0) {\n this.flags &= ~NODE_FLAGS.HAS_FN_SUBS;\n this._fnSubCount = 0;\n } else if (!link.fn && this._objSubCount <= 0) {\n this.flags &= ~NODE_FLAGS.HAS_OBJ_SUBS;\n this._objSubCount = 0;\n }\n }\n\n subscriberCount(): number {\n return this._subscribers.length;\n }\n\n protected _notifySubscribers(newValue: T | undefined, oldValue: T | undefined): void {\n if (!(this.flags & (NODE_FLAGS.HAS_FN_SUBS | NODE_FLAGS.HAS_OBJ_SUBS))) return;\n\n const subs = this._subscribers;\n const len = subs.length;\n\n for (let i = 0; i < len; i++) {\n const s = subs[i];\n if (!s) continue;\n\n try {\n if (s.fn) s.fn(newValue, oldValue);\n else if (s.sub) s.sub.execute();\n } catch (err) {\n this._handleNotifyError(err);\n }\n }\n }\n\n private _handleNotifyError(err: unknown): void {\n console.error(wrapError(err, AtomError, ERROR_MESSAGES.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED));\n }\n}\n","import { IS_DEV, SMI_MAX } from '@/constants';\n\n// Global epoch counter.\nlet collectorEpoch = 0;\n\n/**\n * Next tracking epoch.\n */\nexport const nextEpoch = () => {\n collectorEpoch = (collectorEpoch + 1) & SMI_MAX || 1;\n return collectorEpoch;\n};\n\n/** Current tracking epoch. */\nexport const currentEpoch = () => collectorEpoch;\n\nexport let flushEpoch = 0;\nexport let flushExecutionCount = 0;\nlet isFlushing = false;\n\n/**\n * Starts flush cycle.\n */\nexport function startFlush(): boolean {\n if (isFlushing) {\n if (IS_DEV) console.warn('startFlush() called during flush - ignored');\n return false;\n }\n\n isFlushing = true;\n flushEpoch = (flushEpoch + 1) & SMI_MAX || 1;\n flushExecutionCount = 0;\n return true;\n}\n\n/** Ends flush cycle. */\nexport const endFlush = () => {\n isFlushing = false;\n};\n\n/**\n * Increments execution count.\n */\nexport const incrementFlushExecutionCount = () => (isFlushing ? ++flushExecutionCount : 0);\n\n/**\n * Resets flush state.\n */\nexport function resetFlushState(): void {\n flushEpoch = 0;\n flushExecutionCount = 0;\n isFlushing = false;\n}\n","import { IS_DEV, SCHEDULER_CONFIG } from '@/constants';\nimport { SchedulerError } from '@/errors/errors';\nimport { endFlush, startFlush } from '@/internal/epoch';\n\nexport enum SchedulerPhase {\n IDLE = 0,\n BATCHING = 1,\n FLUSHING = 2,\n}\n\nexport interface SchedulerJob {\n (): void;\n /** Next scheduled epoch */\n _nextEpoch?: number;\n}\n\n/**\n * Scheduler implementation.\n */\nexport const scheduler = {\n /** Queue buffer */\n _queueBuffer: [[], []] as [SchedulerJob[], SchedulerJob[]],\n _bufferIndex: 0,\n _size: 0,\n\n /** Epoch counter */\n _epoch: 0,\n\n /** State flags */\n _isProcessing: false,\n _isBatching: false,\n _isFlushingSync: false,\n\n /** Batching state */\n _batchDepth: 0,\n _batchQueue: [] as SchedulerJob[],\n _batchQueueSize: 0,\n\n /** Config */\n _maxFlushIterations: SCHEDULER_CONFIG.MAX_FLUSH_ITERATIONS as number,\n\n get phase(): SchedulerPhase {\n if (this._isProcessing || this._isFlushingSync) return SchedulerPhase.FLUSHING;\n if (this._isBatching) return SchedulerPhase.BATCHING;\n return SchedulerPhase.IDLE;\n },\n\n get queueSize(): number {\n return this._size;\n },\n\n get isBatching(): boolean {\n return this._isBatching;\n },\n\n /**\n * Schedules job.\n */\n schedule(callback: SchedulerJob): void {\n if (IS_DEV && typeof callback !== 'function') {\n throw new SchedulerError('Scheduler callback must be a function');\n }\n\n // Deduplicate job\n if (callback._nextEpoch === this._epoch) return;\n callback._nextEpoch = this._epoch;\n\n if (this._isBatching || this._isFlushingSync) {\n this._batchQueue[this._batchQueueSize++] = callback;\n return;\n }\n\n // Push to current active buffer\n this._queueBuffer[this._bufferIndex]![this._size++] = callback;\n\n // Wake up if sleeping\n if (!this._isProcessing) {\n this._flush();\n }\n },\n\n /**\n * Triggers flush.\n */\n _flush(): void {\n if (this._isProcessing || this._size === 0) return;\n this._isProcessing = true;\n\n queueMicrotask(this._runLoop);\n },\n\n /**\n * Scheduler loop.\n */\n _runLoop: () => {\n try {\n if (scheduler._size === 0) return;\n\n const started = startFlush();\n scheduler._drainQueue();\n if (started) endFlush();\n } finally {\n scheduler._isProcessing = false;\n // If new jobs arrived during flush (and not batching), re-schedule\n if (scheduler._size > 0 && !scheduler._isBatching) {\n scheduler._flush();\n }\n }\n },\n\n _flushSync(): void {\n this._isFlushingSync = true;\n const started = startFlush();\n try {\n this._mergeBatchQueue();\n this._drainQueue();\n } finally {\n this._isFlushingSync = false;\n if (started) endFlush();\n }\n },\n\n _mergeBatchQueue(): void {\n if (this._batchQueueSize === 0) return;\n\n // Increment epoch\n const epoch = ++this._epoch;\n const bQueue = this._batchQueue;\n const targetBuffer = this._queueBuffer[this._bufferIndex]!;\n let currentSize = this._size;\n\n // Merge batch\n for (let i = 0; i < this._batchQueueSize; i++) {\n const job = bQueue[i]!;\n // Retag jobs\n if (job._nextEpoch !== epoch) {\n job._nextEpoch = epoch;\n targetBuffer[currentSize++] = job;\n }\n }\n\n this._size = currentSize;\n this._batchQueueSize = 0;\n\n // Resize batch queue\n if (bQueue.length > SCHEDULER_CONFIG.BATCH_QUEUE_SHRINK_THRESHOLD) {\n bQueue.length = 0;\n }\n },\n\n _drainQueue(): void {\n let iterations = 0;\n // Process queue\n while (this._size > 0) {\n // Overflow check\n if (++iterations > this._maxFlushIterations) {\n this._handleFlushOverflow();\n return;\n }\n\n this._processQueue();\n // If batch updates happened during processing, merge them in now\n this._mergeBatchQueue();\n }\n },\n\n _processQueue(): void {\n const idx = this._bufferIndex;\n const jobs = this._queueBuffer[idx]!;\n const count = this._size;\n\n // Swap buffers\n this._bufferIndex = idx ^ 1;\n this._size = 0;\n this._epoch++;\n\n for (let i = 0; i < count; i++) {\n // Execute job\n try {\n jobs[i]!();\n } catch (e) {\n console.error(new SchedulerError('Error occurred during scheduler execution', e as Error));\n }\n }\n // Clear the consumed buffer\n jobs.length = 0;\n },\n\n _handleFlushOverflow(): void {\n console.error(\n new SchedulerError(\n `Maximum flush iterations (${this._maxFlushIterations}) exceeded. Possible infinite loop.`\n )\n );\n this._size = 0;\n this._queueBuffer[this._bufferIndex]!.length = 0;\n this._batchQueueSize = 0;\n },\n\n startBatch(): void {\n this._batchDepth++;\n this._isBatching = true;\n },\n\n endBatch(): void {\n if (this._batchDepth === 0) {\n if (IS_DEV) console.warn('endBatch() called without matching startBatch(). Ignoring.');\n return;\n }\n\n if (--this._batchDepth === 0) {\n this._flushSync();\n this._isBatching = false;\n }\n },\n\n setMaxFlushIterations(max: number): void {\n if (max < SCHEDULER_CONFIG.MIN_FLUSH_ITERATIONS)\n throw new SchedulerError(\n `Max flush iterations must be at least ${SCHEDULER_CONFIG.MIN_FLUSH_ITERATIONS}`\n );\n this._maxFlushIterations = max;\n },\n};\n","import type { Listener } from './tracking.types';\n\n/**\n * Global tracking context.\n */\nexport const trackingContext = {\n /** Active listener. */\n current: null as Listener | null,\n\n /**\n * Executes in context.\n *\n * @param listener - The subscriber.\n * @param fn - The logic to execute.\n * @returns The result of `fn`.\n */\n run<T>(listener: Listener, fn: () => T): T {\n const prev = this.current;\n this.current = listener;\n try {\n return fn();\n } finally {\n this.current = prev;\n }\n },\n};\n\n/**\n * Tracking context type.\n */\nexport type ITrackingContext = typeof trackingContext;\n","import { trackingContext } from './context';\n\n/**\n * Untracked execution.\n *\n * @param fn - Function to execute.\n * @returns Result of `fn`.\n */\nexport function untracked<T>(fn: () => T): T {\n const prev = trackingContext.current;\n\n // Skip if untracked\n if (prev === null) return fn();\n\n trackingContext.current = null;\n try {\n return fn();\n } finally {\n trackingContext.current = prev;\n }\n}\n","import { ATOM_STATE_FLAGS, SMI_MAX } from '@/constants';\nimport { ReactiveDependency } from '@/core/base';\nimport { type SubscriberLink, trackDependency } from '@/core/dep-tracking';\nimport { scheduler } from '@/internal/scheduler';\nimport { trackingContext } from '@/tracking';\nimport type { AtomOptions, WritableAtom } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// Pre-compute subscription mask\nconst SUBS_MASK = ATOM_STATE_FLAGS.HAS_FN_SUBS | ATOM_STATE_FLAGS.HAS_OBJ_SUBS;\n\n/**\n * Internal {@link WritableAtom} implementation.\n */\nclass AtomImpl<T> extends ReactiveDependency<T> implements WritableAtom<T> {\n private _value: T;\n /** Old value for notifications */\n private _pendingOldValue: T | undefined = undefined;\n /** Cached notification task */\n private _notifyTask: (() => void) | undefined = undefined;\n protected _subscribers: SubscriberLink<T>[] = [];\n\n constructor(initialValue: T, sync: boolean) {\n super();\n this._value = initialValue;\n if (sync) this.flags |= ATOM_STATE_FLAGS.SYNC;\n debug.attachDebugInfo(this, 'atom', this.id);\n }\n\n get value(): T {\n const current = trackingContext.current;\n if (current) {\n trackDependency(this, current, this._subscribers);\n }\n return this._value;\n }\n\n set value(newValue: T) {\n const oldValue = this._value;\n if (Object.is(oldValue, newValue)) return;\n\n this._value = newValue;\n this.version = (this.version + 1) & SMI_MAX;\n\n const flags = this.flags;\n if ((flags & SUBS_MASK) === 0 || flags & ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED) {\n return;\n }\n\n this._pendingOldValue = oldValue;\n this.flags = flags | ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED;\n\n // Sync handling\n if (flags & ATOM_STATE_FLAGS.SYNC && !scheduler.isBatching) {\n this._flushNotifications();\n return;\n }\n\n // Async scheduling\n if (!this._notifyTask) {\n // Create notification task\n this._notifyTask = () => this._flushNotifications();\n }\n scheduler.schedule(this._notifyTask);\n }\n\n /**\n * Triggers subscribers.\n */\n private _flushNotifications(): void {\n const flags = this.flags;\n // Guard: Spurious flush or already disposed\n if (!(flags & ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED) || flags & ATOM_STATE_FLAGS.DISPOSED) {\n return;\n }\n\n const oldValue = this._pendingOldValue as T;\n this._pendingOldValue = undefined;\n this.flags &= ~ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED;\n\n this._notifySubscribers(this._value, oldValue);\n }\n\n peek(): T {\n return this._value;\n }\n\n dispose(): void {\n if (this.flags & ATOM_STATE_FLAGS.DISPOSED) return;\n\n this._subscribers.length = 0;\n this.flags |= ATOM_STATE_FLAGS.DISPOSED;\n // Release references\n this._value = undefined as T;\n this._pendingOldValue = undefined;\n this._notifyTask = undefined;\n }\n}\n\n/**\n * Creates a reactive atom holding mutable state.\n *\n * @param initialValue - The initial value of the atom.\n * @param options - Configuration options (sync: boolean).\n */\nexport function atom<T>(initialValue: T, options: AtomOptions = {}): WritableAtom<T> {\n return new AtomImpl(initialValue, options.sync ?? false);\n}\n","import { IS_DEV } from '@/constants';\nimport type { PoolStats } from '@/types';\n\n/**\n * Array pool.\n *\n * @template T - Element type.\n */\nexport class ArrayPool<T> {\n private readonly pool: T[][] = [];\n\n // Mutable stats container, null in production\n private stats = IS_DEV\n ? {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 },\n }\n : null;\n\n /**\n * @param limit - Max unique arrays to hold (default: 50). Prevents the pool itself from consuming too much memory.\n * @param capacity - Max length of an array to accept (default: 256).\n */\n constructor(\n private readonly limit = 50,\n private readonly capacity = 256\n ) {}\n\n /**\n * Acquires array.\n */\n acquire(): T[] {\n if (IS_DEV && this.stats) {\n this.stats.acquired++;\n }\n // LIFO reuse for better cache locality\n return this.pool.pop() ?? [];\n }\n\n /**\n * Releases array.\n *\n * @param arr - Array to release.\n * @param emptyConst - Optional empty constant.\n */\n release(arr: T[], emptyConst?: readonly T[]): void {\n if (emptyConst && arr === emptyConst) return;\n\n if (arr.length > this.capacity) {\n if (IS_DEV && this.stats) this.stats.rejected.tooLarge++;\n return;\n }\n\n if (this.pool.length >= this.limit) {\n if (IS_DEV && this.stats) this.stats.rejected.poolFull++;\n return;\n }\n\n if (Object.isFrozen(arr)) {\n if (IS_DEV && this.stats) this.stats.rejected.frozen++;\n return;\n }\n\n arr.length = 0;\n this.pool.push(arr);\n\n if (IS_DEV && this.stats) {\n this.stats.released++;\n }\n }\n\n /**\n * Pool stats.\n */\n getStats(): PoolStats | null {\n if (!IS_DEV || !this.stats) return null;\n\n const { acquired, released, rejected } = this.stats;\n const leakCount =\n acquired - released - (rejected.frozen + rejected.tooLarge + rejected.poolFull);\n\n return {\n acquired,\n released,\n rejected: { ...rejected },\n leaked: leakCount,\n poolSize: this.pool.length,\n };\n }\n\n /**\n * Resets pool.\n */\n reset(): void {\n this.pool.length = 0;\n if (IS_DEV && this.stats) {\n this.stats = {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 },\n };\n }\n }\n}\n","import type { DependencyLink, SubscriberLink } from '@/core/dep-tracking';\nimport type { Dependency, Subscriber } from '@/types';\nimport { ArrayPool } from '@/utils/array-pool';\n\nconst freeze = <T>(arr: T[]): readonly T[] => Object.freeze(arr);\n\n// Empty constants\nexport const EMPTY_DEPS = freeze<Dependency>([]);\nexport const EMPTY_SUBS = freeze<Subscriber>([]);\nexport const EMPTY_UNSUBS = freeze<() => void>([]);\nexport const EMPTY_VERSIONS = freeze<number>([]);\nexport const EMPTY_LINKS = freeze<DependencyLink>([]);\nexport const EMPTY_SUBSCRIBERS = freeze<SubscriberLink<unknown>>([]);\n\n// Array pools\nexport const depArrayPool = new ArrayPool<Dependency>();\nexport const unsubArrayPool = new ArrayPool<() => void>();\nexport const versionArrayPool = new ArrayPool<number>();\nexport const linksArrayPool = new ArrayPool<DependencyLink>();\nexport const subscriberPool = new ArrayPool<SubscriberLink<unknown>>();\n","import type { ComputedAtom, EffectObject, ReadonlyAtom, WritableAtom } from '@/types';\n\n/**\n * Readonly atom check.\n *\n * @param obj - Object to check.\n */\nexport function isAtom(obj: unknown): obj is ReadonlyAtom {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n 'value' in obj &&\n typeof (obj as { subscribe?: unknown }).subscribe === 'function'\n );\n}\n\n/**\n * Writable atom check.\n */\nexport function isWritable(obj: unknown): obj is WritableAtom {\n return isAtom(obj) && typeof (obj as { dispose?: unknown }).dispose === 'function';\n}\n\n/**\n * Computed atom check.\n */\nexport function isComputed(obj: unknown): obj is ComputedAtom {\n return isAtom(obj) && typeof (obj as { invalidate?: unknown }).invalidate === 'function';\n}\n\n/**\n * Effect object check.\n */\nexport function isEffect(obj: unknown): obj is EffectObject {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n typeof (obj as { dispose?: unknown }).dispose === 'function' &&\n typeof (obj as { run?: unknown }).run === 'function'\n );\n}\n\n/**\n * Promise check.\n */\nexport function isPromise<T>(value: unknown): value is Promise<T> {\n return (\n value !== null &&\n typeof value === 'object' &&\n typeof (value as { then?: unknown }).then === 'function'\n );\n}\n","import { AsyncState, COMPUTED_STATE_FLAGS, EMPTY_ERROR_ARRAY, SMI_MAX } from '@/constants';\nimport { ReactiveDependency } from '@/core/base';\nimport {\n DependencyLink,\n type SubscriberLink,\n syncDependencies,\n trackDependency,\n} from '@/core/dep-tracking';\nimport { ComputedError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport { currentEpoch, nextEpoch } from '@/internal/epoch';\nimport { EMPTY_LINKS, linksArrayPool } from '@/internal/pool';\nimport { trackingContext } from '@/tracking';\nimport type {\n AsyncStateType,\n ComputedAtom,\n ComputedOptions,\n Dependency,\n Subscriber,\n} from '@/types';\nimport { debug, NO_DEFAULT_VALUE } from '@/utils/debug';\nimport { wrapError } from '@/utils/error';\nimport { isPromise } from '@/utils/type-guards';\n\n// Async state map\nconst ASYNC_STATE_MASK =\n COMPUTED_STATE_FLAGS.RESOLVED | COMPUTED_STATE_FLAGS.PENDING | COMPUTED_STATE_FLAGS.REJECTED;\nconst ASYNC_STATE_LOOKUP = Array(ASYNC_STATE_MASK + 1).fill(AsyncState.IDLE);\nASYNC_STATE_LOOKUP[COMPUTED_STATE_FLAGS.RESOLVED] = AsyncState.RESOLVED;\nASYNC_STATE_LOOKUP[COMPUTED_STATE_FLAGS.PENDING] = AsyncState.PENDING;\nASYNC_STATE_LOOKUP[COMPUTED_STATE_FLAGS.REJECTED] = AsyncState.REJECTED;\n\nconst MAX_ASYNC_RETRIES = 3;\nconst MAX_PROMISE_ID = Number.MAX_SAFE_INTEGER - 1;\n\n/**\n * Computed atom implementation.\n */\nclass ComputedAtomImpl<T> extends ReactiveDependency<T> implements ComputedAtom<T>, Subscriber {\n private _value: T;\n private _error: Error | null = null;\n /** Promise tracking ID */\n private _promiseId = 0;\n\n private readonly _equal: (a: T, b: T) => boolean;\n private readonly _fn: () => T | Promise<T>;\n private readonly _defaultValue: T;\n private readonly _onError: ((error: Error) => void) | null;\n\n protected _subscribers: SubscriberLink<T>[] = [];\n private _links: DependencyLink[] = EMPTY_LINKS as unknown as DependencyLink[];\n\n /** Error cache */\n private _cachedErrors: readonly Error[] | null = null;\n private _errorCacheEpoch = -1;\n\n // Async state\n private _asyncStartAggregateVersion = 0;\n private _asyncRetryCount = 0;\n\n // Dependency collection state\n private _trackEpoch = -1;\n private _trackLinks: DependencyLink[] = EMPTY_LINKS as unknown as DependencyLink[];\n private _trackCount = 0;\n\n constructor(fn: () => T | Promise<T>, options: ComputedOptions<T> = {}) {\n if (typeof fn !== 'function') throw new ComputedError(ERROR_MESSAGES.COMPUTED_MUST_BE_FUNCTION);\n super();\n\n this._value = undefined as T;\n // Start dirty so first access triggers computation\n this.flags = COMPUTED_STATE_FLAGS.DIRTY | COMPUTED_STATE_FLAGS.IDLE;\n this._equal = options.equal ?? Object.is;\n this._fn = fn;\n this._defaultValue = 'defaultValue' in options ? options.defaultValue : (NO_DEFAULT_VALUE as T);\n this._onError = options.onError ?? null;\n\n debug.attachDebugInfo(this, 'computed', this.id);\n\n // Eager evaluation if not lazy\n if (options.lazy === false) {\n try {\n this._recompute();\n } catch {} // Ignore error during eager init, it will be captured later\n }\n }\n\n private _track(): void {\n const current = trackingContext.current;\n if (current) trackDependency(this, current, this._subscribers);\n }\n\n get value(): T {\n this._track();\n\n const flags = this.flags;\n if (\n (flags &\n (COMPUTED_STATE_FLAGS.RESOLVED |\n COMPUTED_STATE_FLAGS.DIRTY |\n COMPUTED_STATE_FLAGS.IDLE)) ===\n COMPUTED_STATE_FLAGS.RESOLVED\n ) {\n return this._value;\n }\n\n if (flags & COMPUTED_STATE_FLAGS.DISPOSED) {\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_DISPOSED);\n }\n\n if (flags & COMPUTED_STATE_FLAGS.RECOMPUTING) {\n if (this._defaultValue !== (NO_DEFAULT_VALUE as T)) return this._defaultValue;\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_CIRCULAR_DEPENDENCY);\n }\n\n if (flags & (COMPUTED_STATE_FLAGS.DIRTY | COMPUTED_STATE_FLAGS.IDLE)) {\n this._recompute();\n // Re-read flags after update\n if (this.flags & COMPUTED_STATE_FLAGS.RESOLVED) return this._value;\n }\n\n // 3. Async/Error handling\n const def = this._defaultValue;\n const hasDef = def !== (NO_DEFAULT_VALUE as T);\n\n if (this.flags & COMPUTED_STATE_FLAGS.PENDING) {\n if (hasDef) return def;\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n\n if (this.flags & COMPUTED_STATE_FLAGS.REJECTED) {\n if ((this._error as ComputedError)?.recoverable && hasDef) return def;\n throw this._error;\n }\n\n return this._value;\n }\n\n peek(): T {\n return this._value;\n }\n\n get state(): AsyncStateType {\n this._track();\n return ASYNC_STATE_LOOKUP[this.flags & ASYNC_STATE_MASK];\n }\n\n get hasError(): boolean {\n this._track();\n if (this.flags & (COMPUTED_STATE_FLAGS.REJECTED | COMPUTED_STATE_FLAGS.HAS_ERROR)) return true;\n\n // Check dependencies\n const links = this._links;\n for (let i = 0, len = links.length; i < len; i++) {\n const node = links[i]?.node;\n if (node && node.flags & COMPUTED_STATE_FLAGS.HAS_ERROR) return true;\n }\n return false;\n }\n\n // ... (isValid, errors, lastError getters remain structurally similar, omitted for brevity if mostly unchanged) ...\n get isValid(): boolean {\n return !this.hasError;\n }\n\n get errors(): readonly Error[] {\n this._track();\n if (!this.hasError) return EMPTY_ERROR_ARRAY;\n\n const epoch = currentEpoch();\n if (this._errorCacheEpoch === epoch && this._cachedErrors) return this._cachedErrors;\n\n const errorSet = new Set<Error>();\n if (this._error) errorSet.add(this._error);\n\n const links = this._links;\n for (let i = 0, len = links.length; i < len; i++) {\n const dep = links[i]!.node;\n if (dep.flags & COMPUTED_STATE_FLAGS.HAS_ERROR) {\n const computedDep = dep as unknown as ComputedAtom<unknown>;\n if (computedDep.errors) {\n const depErrors = computedDep.errors;\n for (let j = 0; j < depErrors.length; j++) {\n const err = depErrors[j];\n if (err) errorSet.add(err);\n }\n }\n }\n }\n\n const errors = Object.freeze(Array.from(errorSet));\n this._errorCacheEpoch = epoch;\n this._cachedErrors = errors;\n return errors;\n }\n\n get lastError(): Error | null {\n this._track();\n return this._error;\n }\n\n get isPending(): boolean {\n this._track();\n return (this.flags & COMPUTED_STATE_FLAGS.PENDING) !== 0;\n }\n\n get isResolved(): boolean {\n this._track();\n return (this.flags & COMPUTED_STATE_FLAGS.RESOLVED) !== 0;\n }\n\n invalidate(): void {\n this._markDirty();\n this._errorCacheEpoch = -1;\n this._cachedErrors = null;\n }\n\n dispose(): void {\n if (this.flags & COMPUTED_STATE_FLAGS.DISPOSED) return;\n\n const links = this._links;\n if (links !== EMPTY_LINKS) {\n for (let i = 0, len = links.length; i < len; i++) {\n links[i]!.unsub?.();\n }\n linksArrayPool.release(links);\n this._links = EMPTY_LINKS as unknown as DependencyLink[];\n }\n\n this._subscribers.length = 0;\n this.flags =\n COMPUTED_STATE_FLAGS.DISPOSED | COMPUTED_STATE_FLAGS.DIRTY | COMPUTED_STATE_FLAGS.IDLE;\n\n // Release Memory\n this._error = null;\n this._value = undefined as T;\n this._promiseId = (this._promiseId + 1) % MAX_PROMISE_ID;\n this._cachedErrors = null;\n this._errorCacheEpoch = -1;\n }\n\n addDependency(dep: Dependency): void {\n // Deduplicate dependencies\n if (dep._lastSeenEpoch === this._trackEpoch) return;\n dep._lastSeenEpoch = this._trackEpoch;\n\n // Resize array if needed\n if (this._trackCount < this._trackLinks.length) {\n const link = this._trackLinks[this._trackCount]!;\n link.node = dep;\n link.version = dep.version;\n } else {\n this._trackLinks.push(new DependencyLink(dep, dep.version));\n }\n this._trackCount++;\n }\n\n private _commitDeps(prevLinks: DependencyLink[]): void {\n // Sync dependencies\n this._trackLinks.length = this._trackCount;\n syncDependencies(this._trackLinks, prevLinks, this);\n this._links = this._trackLinks;\n }\n\n private _recompute(): void {\n if (this.flags & COMPUTED_STATE_FLAGS.RECOMPUTING) return;\n this.flags |= COMPUTED_STATE_FLAGS.RECOMPUTING;\n\n const prevLinks = this._links;\n this._trackEpoch = nextEpoch();\n this._trackLinks = linksArrayPool.acquire();\n this._trackCount = 0;\n\n let committed = false;\n try {\n // Execute function\n const result = trackingContext.run(this, this._fn);\n\n this._commitDeps(prevLinks);\n committed = true;\n\n // Handle Result\n if (isPromise(result)) {\n this._handleAsyncComputation(result);\n } else {\n this._finalizeResolution(result);\n }\n } catch (e) {\n // Commit dependencies on error\n if (!committed) {\n try {\n this._commitDeps(prevLinks);\n committed = true;\n } catch {}\n }\n this._handleError(e as Error, ERROR_MESSAGES.COMPUTED_COMPUTATION_FAILED, true);\n } finally {\n // Release pool\n if (committed && prevLinks !== EMPTY_LINKS) {\n linksArrayPool.release(prevLinks);\n } else if (!committed) {\n linksArrayPool.release(this._trackLinks);\n }\n\n // Reset transient state\n this._trackEpoch = -1;\n this._trackLinks = EMPTY_LINKS as unknown as DependencyLink[];\n this._trackCount = 0;\n this.flags &= ~COMPUTED_STATE_FLAGS.RECOMPUTING;\n }\n }\n\n private _handleAsyncComputation(promise: Promise<T>): void {\n this.flags =\n (this.flags | COMPUTED_STATE_FLAGS.PENDING) &\n ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.DIRTY |\n COMPUTED_STATE_FLAGS.RESOLVED |\n COMPUTED_STATE_FLAGS.REJECTED\n );\n // Notify pending\n this._notifySubscribers(undefined, undefined);\n\n this._asyncStartAggregateVersion = this._captureVersionSnapshot();\n this._asyncRetryCount = 0;\n // Invalidate old promises\n this._promiseId = (this._promiseId + 1) % MAX_PROMISE_ID;\n const promiseId = this._promiseId;\n\n promise.then(\n (res) => {\n if (promiseId !== this._promiseId) return; // Stale\n\n // Check for stale reads (did deps change while we waited?)\n if (this._captureVersionSnapshot() !== this._asyncStartAggregateVersion) {\n if (this._asyncRetryCount++ < MAX_ASYNC_RETRIES) {\n return this._markDirty(); // Retry\n }\n return this._handleError(\n new ComputedError(`Async drift threshold exceeded after ${MAX_ASYNC_RETRIES} retries.`),\n ERROR_MESSAGES.COMPUTED_ASYNC_COMPUTATION_FAILED\n );\n }\n\n this._finalizeResolution(res);\n this._notifySubscribers(res, undefined);\n },\n (err) =>\n promiseId === this._promiseId &&\n this._handleError(err, ERROR_MESSAGES.COMPUTED_ASYNC_COMPUTATION_FAILED)\n );\n }\n\n private _captureVersionSnapshot(): number {\n let aggregate = 0;\n const links = this._links;\n for (let i = 0, len = links.length; i < len; i++) {\n // Hash mixing\n aggregate = ((((aggregate << 5) - aggregate) | 0) + links[i]!.node.version) & SMI_MAX;\n }\n return aggregate;\n }\n\n private _handleError(err: unknown, msg: string, throwErr = false): void {\n const error = wrapError(err, ComputedError, msg);\n\n if (!throwErr && !(this.flags & COMPUTED_STATE_FLAGS.REJECTED)) {\n // Update version\n this.version = (this.version + 1) & SMI_MAX;\n }\n\n this._error = error;\n this.flags =\n (this.flags &\n ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.DIRTY |\n COMPUTED_STATE_FLAGS.PENDING |\n COMPUTED_STATE_FLAGS.RESOLVED\n )) |\n (COMPUTED_STATE_FLAGS.REJECTED | COMPUTED_STATE_FLAGS.HAS_ERROR);\n\n if (this._onError) {\n try {\n this._onError(error);\n } catch (e) {\n console.error(ERROR_MESSAGES.CALLBACK_ERROR_IN_ERROR_HANDLER, e);\n }\n }\n\n if (throwErr) throw error;\n this._notifySubscribers(undefined, undefined);\n }\n\n private _finalizeResolution(value: T): void {\n // Only bump version if value actually changed or first resolve\n if (!(this.flags & COMPUTED_STATE_FLAGS.RESOLVED) || !this._equal(this._value, value)) {\n this.version = (this.version + 1) & SMI_MAX;\n }\n\n this._value = value;\n this._error = null;\n this.flags =\n (this.flags | COMPUTED_STATE_FLAGS.RESOLVED) &\n ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.DIRTY |\n COMPUTED_STATE_FLAGS.PENDING |\n COMPUTED_STATE_FLAGS.REJECTED |\n COMPUTED_STATE_FLAGS.HAS_ERROR\n );\n\n this._cachedErrors = null;\n this._errorCacheEpoch = -1;\n }\n\n execute(): void {\n // Subscriber implementation\n this._markDirty();\n }\n\n /** @internal */\n _markDirty(): void {\n if (this.flags & (COMPUTED_STATE_FLAGS.RECOMPUTING | COMPUTED_STATE_FLAGS.DIRTY)) return;\n this.flags |= COMPUTED_STATE_FLAGS.DIRTY;\n this._notifySubscribers(undefined, undefined);\n }\n}\n\nObject.freeze(ComputedAtomImpl.prototype);\n\n/**\n * Creates a computed value.\n * @param fn - Computation function\n * @param options - Options object\n */\nexport function computed<T>(fn: () => T, options?: ComputedOptions<T>): ComputedAtom<T>;\nexport function computed<T>(\n fn: () => Promise<T>,\n options: ComputedOptions<T> & { defaultValue: T }\n): ComputedAtom<T>;\nexport function computed<T>(\n fn: () => T | Promise<T>,\n options: ComputedOptions<T> = {}\n): ComputedAtom<T> {\n return new ComputedAtomImpl(fn, options);\n}\n","import { EFFECT_STATE_FLAGS, IS_DEV, SCHEDULER_CONFIG, TIME_CONSTANTS } from '@/constants';\nimport { ReactiveNode } from '@/core/base';\nimport { DependencyLink } from '@/core/dep-tracking';\nimport { EffectError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport {\n flushEpoch,\n flushExecutionCount,\n incrementFlushExecutionCount,\n nextEpoch,\n} from '@/internal/epoch';\nimport { EMPTY_LINKS, linksArrayPool } from '@/internal/pool';\nimport { scheduler } from '@/internal/scheduler';\nimport { type DependencyTracker, trackingContext, untracked } from '@/tracking';\nimport type { Dependency, EffectFunction, EffectObject, EffectOptions } from '@/types';\nimport { debug } from '@/utils/debug';\nimport { wrapError } from '@/utils/error';\nimport { isPromise } from '@/utils/type-guards';\n\n/**\n * Effect implementation.\n */\nclass EffectImpl extends ReactiveNode implements EffectObject, DependencyTracker {\n private _cleanup: (() => void) | null = null;\n private _links: DependencyLink[] = EMPTY_LINKS as unknown as DependencyLink[];\n private _nextLinks: DependencyLink[] | null = null;\n private _executeTask: (() => void) | undefined;\n\n private readonly _onError: ((error: unknown) => void) | null;\n\n // Cycle detection\n private _currentEpoch = -1;\n private _lastFlushEpoch = -1;\n private _executionsInEpoch = 0;\n\n private readonly _fn: EffectFunction;\n private readonly _sync: boolean;\n private readonly _maxExecutions: number;\n private readonly _maxExecutionsPerFlush: number;\n private readonly _trackModifications: boolean;\n\n // Execution history (Dev)\n private _history: number[] | null;\n private _executionCount = 0;\n private _historyPtr = 0;\n private readonly _historyCapacity: number;\n private _execId = 0;\n\n constructor(fn: EffectFunction, options: EffectOptions = {}) {\n super();\n this._fn = fn;\n this._onError = options.onError ?? null;\n this._sync = options.sync ?? false;\n this._maxExecutions =\n options.maxExecutionsPerSecond ?? SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_SECOND;\n this._maxExecutionsPerFlush =\n options.maxExecutionsPerFlush ?? SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_EFFECT;\n this._trackModifications = options.trackModifications ?? false;\n\n // Initialize history buffer\n const isFiniteLimit = Number.isFinite(this._maxExecutions);\n const capacity = isFiniteLimit\n ? Math.min(this._maxExecutions + 1, SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_SECOND + 1)\n : 0;\n this._historyCapacity = capacity;\n this._history = IS_DEV && isFiniteLimit && capacity > 0 ? new Array(capacity).fill(0) : null;\n\n debug.attachDebugInfo(this, 'effect', this.id);\n }\n\n public run(): void {\n if (this.flags & EFFECT_STATE_FLAGS.DISPOSED) {\n throw new EffectError(ERROR_MESSAGES.EFFECT_DISPOSED);\n }\n this.execute(true);\n }\n\n public dispose(): void {\n if (this.flags & EFFECT_STATE_FLAGS.DISPOSED) return;\n this.flags |= EFFECT_STATE_FLAGS.DISPOSED;\n\n this._execCleanup();\n this._releaseLinks(this._links);\n\n // Reset State\n this._links = EMPTY_LINKS as unknown as DependencyLink[];\n this._executeTask = undefined;\n }\n\n public addDependency(dep: Dependency): void {\n // Only track if currently executing (double check)\n if (!(this.flags & EFFECT_STATE_FLAGS.EXECUTING)) return;\n\n // Deduplicate in current epoch\n if (dep._lastSeenEpoch === this._currentEpoch) return;\n dep._lastSeenEpoch = this._currentEpoch;\n\n const nextLinks = this._nextLinks!;\n\n if (dep._tempUnsub) {\n nextLinks.push(new DependencyLink(dep, dep.version, dep._tempUnsub));\n dep._tempUnsub = undefined;\n return;\n }\n\n try {\n const unsubscribe = dep.subscribe(() => {\n if (this._trackModifications && this.flags & EFFECT_STATE_FLAGS.EXECUTING)\n dep._modifiedAtEpoch = this._currentEpoch;\n\n if (this._sync) return this.execute();\n\n // Task creation\n if (!this._executeTask) this._executeTask = () => this.execute();\n scheduler.schedule(this._executeTask!);\n });\n nextLinks.push(new DependencyLink(dep, dep.version, unsubscribe));\n } catch (error) {\n console.error(wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_EXECUTION_FAILED));\n }\n }\n\n /**\n * Executes effect with tracking.\n */\n public execute(force = false): void {\n if (this.flags & (EFFECT_STATE_FLAGS.DISPOSED | EFFECT_STATE_FLAGS.EXECUTING)) return;\n\n // Skip if not dirty\n if (!force && this._links.length > 0 && !this._isDirty()) return;\n\n this._checkInfiniteLoops();\n\n this.flags |= EFFECT_STATE_FLAGS.EXECUTING;\n this._execCleanup();\n\n const prevLinks = this._links;\n // Park subscriptions\n if (prevLinks !== EMPTY_LINKS) {\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n const link = prevLinks[i];\n if (link) link.node._tempUnsub = link.unsub;\n }\n }\n\n // Setup tracking\n const nextLinks = linksArrayPool.acquire();\n this._nextLinks = nextLinks;\n this._currentEpoch = nextEpoch();\n\n let committed = false;\n try {\n const result = trackingContext.run(this, this._fn);\n this._links = nextLinks;\n committed = true;\n\n this._checkLoopWarnings();\n\n // Handle result\n if (isPromise(result)) {\n this._handleAsyncResult(result);\n } else {\n this._cleanup = typeof result === 'function' ? result : null;\n }\n } catch (error) {\n // Commit on error\n committed = true;\n this._handleExecutionError(error);\n this._cleanup = null;\n } finally {\n this._finalizeDependencies(committed, prevLinks, nextLinks);\n this.flags &= ~EFFECT_STATE_FLAGS.EXECUTING;\n }\n }\n\n private _handleAsyncResult(promise: Promise<unknown>): void {\n const execId = ++this._execId;\n promise.then(\n (cleanup) => {\n // Guard against race conditions (new execution or disposal happened)\n if (execId !== this._execId || this.flags & EFFECT_STATE_FLAGS.DISPOSED) {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (e) {\n this._handleExecutionError(e, ERROR_MESSAGES.EFFECT_CLEANUP_FAILED);\n }\n }\n return;\n }\n if (typeof cleanup === 'function') this._cleanup = cleanup as () => void;\n },\n (err) => execId === this._execId && this._handleExecutionError(err)\n );\n }\n\n private _finalizeDependencies(\n committed: boolean,\n prevLinks: DependencyLink[],\n nextLinks: DependencyLink[]\n ): void {\n this._nextLinks = null;\n\n if (committed) {\n // Cleanup unused subscriptions\n if (prevLinks !== EMPTY_LINKS) {\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n const link = prevLinks[i];\n const unsub = link?.node._tempUnsub;\n if (unsub) {\n unsub();\n if (link) link.node._tempUnsub = undefined;\n }\n }\n linksArrayPool.release(prevLinks);\n }\n } else {\n // Abort and restore\n this._releaseLinks(nextLinks);\n linksArrayPool.release(nextLinks);\n\n if (prevLinks !== EMPTY_LINKS) {\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n // Clear park slots\n if (prevLinks[i]) prevLinks[i]!.node._tempUnsub = undefined;\n }\n }\n }\n }\n\n private _releaseLinks(links: DependencyLink[]): void {\n if (links === EMPTY_LINKS) return;\n for (let i = 0, len = links.length; i < len; i++) {\n links[i]?.unsub?.();\n }\n linksArrayPool.release(links);\n }\n\n private _isDirty(): boolean {\n const links = this._links;\n for (let i = 0, len = links.length; i < len; i++) {\n const link = links[i]!;\n const dep = link.node;\n // Version Check\n if (dep.version !== link.version) return true;\n\n // Check computed values\n if ('value' in (dep as object)) {\n try {\n untracked(() => (dep as { value: unknown }).value);\n } catch {\n return true; // Error usually implies dirty/re-eval needed\n }\n if (dep.version !== link.version) return true;\n }\n }\n return false;\n }\n\n private _execCleanup(): void {\n if (!this._cleanup) return;\n try {\n this._cleanup();\n } catch (error) {\n this._handleExecutionError(error, ERROR_MESSAGES.EFFECT_CLEANUP_FAILED);\n }\n this._cleanup = null;\n }\n\n private _checkInfiniteLoops(): void {\n const epoch = flushEpoch;\n if (this._lastFlushEpoch !== epoch) {\n this._lastFlushEpoch = epoch;\n this._executionsInEpoch = 0;\n }\n\n if (++this._executionsInEpoch > this._maxExecutionsPerFlush)\n this._throwInfiniteLoopError('per-effect');\n if (incrementFlushExecutionCount() > SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_FLUSH)\n this._throwInfiniteLoopError('global');\n\n this._executionCount++;\n\n // Frequency check\n if (this._history) {\n const now = Date.now();\n this._history[this._historyPtr] = now;\n this._historyPtr = (this._historyPtr + 1) % this._historyCapacity;\n const oldest = this._history[this._historyPtr] || 0;\n\n if (oldest > 0 && now - oldest < TIME_CONSTANTS.ONE_SECOND_MS) {\n const err = new EffectError(\n `Effect executed too frequently within 1 second. Suspected infinite loop.`\n );\n this.dispose();\n this._handleExecutionError(err);\n if (IS_DEV) throw err;\n }\n }\n }\n\n get isDisposed(): boolean {\n return (this.flags & EFFECT_STATE_FLAGS.DISPOSED) !== 0;\n }\n get executionCount(): number {\n return this._executionCount;\n }\n get isExecuting(): boolean {\n return (this.flags & EFFECT_STATE_FLAGS.EXECUTING) !== 0;\n }\n\n private _throwInfiniteLoopError(type: 'per-effect' | 'global'): never {\n const error = new EffectError(\n `Infinite loop detected (${type}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${flushExecutionCount}`\n );\n this.dispose();\n console.error(error);\n throw error;\n }\n\n private _handleExecutionError(\n error: unknown,\n message: string = ERROR_MESSAGES.EFFECT_EXECUTION_FAILED\n ): void {\n const errorObj = wrapError(error, EffectError, message);\n console.error(errorObj);\n if (this._onError) {\n try {\n this._onError(errorObj);\n } catch (e) {\n console.error(wrapError(e, EffectError, ERROR_MESSAGES.CALLBACK_ERROR_IN_ERROR_HANDLER));\n }\n }\n }\n\n private _checkLoopWarnings(): void {\n if (this._trackModifications && debug.enabled) {\n const epoch = this._currentEpoch;\n const links = this._links;\n for (let i = 0, len = links.length; i < len; i++) {\n const dep = links[i]!.node;\n if (dep._modifiedAtEpoch === epoch) {\n debug.warn(\n true,\n `Effect is reading a dependency (${debug.getDebugName(dep) || 'unknown'}) that it just modified. Infinite loop may occur`\n );\n }\n }\n }\n }\n}\n\n/**\n * Creates and starts an effect.\n *\n * @param fn - Effect function.\n * @param options - Configuration options.\n * @returns Effect instance.\n */\nexport function effect(fn: EffectFunction, options: EffectOptions = {}): EffectObject {\n if (typeof fn !== 'function') {\n throw new EffectError(ERROR_MESSAGES.EFFECT_MUST_BE_FUNCTION);\n }\n\n const effectInstance = new EffectImpl(fn, options);\n effectInstance.execute();\n\n return effectInstance;\n}\n","import { scheduler } from './scheduler';\n\n/**\n * Batches updates.\n *\n * @param fn - Batch function.\n * @returns - Result of `fn`.\n */\nexport function batch<T>(fn: () => T): T {\n // Validate callback\n if (typeof fn !== 'function') {\n throw new TypeError('Batch callback must be a function');\n }\n\n scheduler.startBatch();\n try {\n return fn();\n } finally {\n scheduler.endBatch();\n }\n}\n"],"names":["TIME_CONSTANTS","AsyncState","NODE_FLAGS","EFFECT_STATE_FLAGS","COMPUTED_STATE_FLAGS","ATOM_STATE_FLAGS","POOL_CONFIG","SCHEDULER_CONFIG","DEBUG_CONFIG","SMI_MAX","IS_DEV","EMPTY_ERROR_ARRAY","AtomError","message","cause","recoverable","ComputedError","EffectError","SchedulerError","DEBUG_NAME","DEBUG_ID","DEBUG_TYPE","NO_DEFAULT_VALUE","hasDeps","o","checkCircularInternal","dep","current","visited","deps","i","child","debug","cond","msg","obj","type","id","t","nextId","generateId","trackDependency","dependency","subscribers","fn","len","link","SubscriberLink","sub","syncDependencies","nextLinks","prevLinks","tracker","node","DependencyLink","version","unsub","ERROR_MESSAGES","wrapError","error","ErrorClass","context","isNativeError","originalMessage","finalMessage","ReactiveNode","ReactiveDependency","listener","isFn","subs","idx","last","newValue","oldValue","s","err","collectorEpoch","nextEpoch","currentEpoch","flushEpoch","flushExecutionCount","isFlushing","startFlush","endFlush","incrementFlushExecutionCount","scheduler","callback","started","epoch","bQueue","targetBuffer","currentSize","job","iterations","jobs","count","e","max","trackingContext","prev","untracked","SUBS_MASK","AtomImpl","initialValue","sync","flags","atom","options","ArrayPool","limit","capacity","arr","emptyConst","acquired","released","rejected","leakCount","freeze","EMPTY_LINKS","linksArrayPool","isAtom","isComputed","isEffect","isPromise","value","ASYNC_STATE_MASK","ASYNC_STATE_LOOKUP","MAX_ASYNC_RETRIES","MAX_PROMISE_ID","ComputedAtomImpl","def","hasDef","links","errorSet","computedDep","depErrors","j","errors","committed","result","promise","promiseId","res","aggregate","throwErr","computed","EffectImpl","isFiniteLimit","unsubscribe","force","execId","cleanup","now","oldest","errorObj","effect","effectInstance","batch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"atom-effect.min.js","sources":["../src/constants.ts","../src/errors/errors.ts","../src/utils/debug.ts","../src/core/dep-tracking.ts","../src/errors/messages.ts","../src/utils/error.ts","../src/core/base.ts","../src/internal/epoch.ts","../src/internal/scheduler.ts","../src/tracking/context.ts","../src/tracking/untracked.ts","../src/core/atom.ts","../src/utils/array-pool.ts","../src/internal/pool.ts","../src/utils/type-guards.ts","../src/core/computed.ts","../src/core/effect.ts","../src/internal/batch.ts"],"sourcesContent":["/**\n * Global time constants.\n * Used for debouncing, throttling, and scheduling.\n */\nexport const TIME_CONSTANTS = {\n ONE_SECOND_MS: 1000,\n} as const;\n\n/**\n * Async operation states.\n */\nexport const AsyncState = {\n IDLE: 'idle',\n PENDING: 'pending',\n RESOLVED: 'resolved',\n REJECTED: 'rejected',\n} as const;\n\n/**\n * Base Node Flags.\n */\nexport const NODE_FLAGS = {\n DISPOSED: 1 << 0,\n} as const;\n\n/**\n * Effect flags.\n */\nexport const EFFECT_STATE_FLAGS = {\n ...NODE_FLAGS,\n EXECUTING: 1 << 3,\n} as const;\n\n/**\n * Computed flags.\n */\nexport const COMPUTED_STATE_FLAGS = {\n ...NODE_FLAGS,\n DIRTY: 1 << 3,\n IDLE: 1 << 4,\n PENDING: 1 << 5,\n RESOLVED: 1 << 6,\n REJECTED: 1 << 7,\n RECOMPUTING: 1 << 8,\n HAS_ERROR: 1 << 9,\n} as const;\n\n/**\n * Writable Atom Flags.\n */\nexport const ATOM_STATE_FLAGS = {\n ...NODE_FLAGS,\n SYNC: 1 << 3,\n NOTIFICATION_SCHEDULED: 1 << 4,\n} as const;\n\n/**\n * Array pool configuration.\n */\nexport const POOL_CONFIG = {\n MAX_SIZE: 1000,\n WARMUP_SIZE: 100,\n} as const;\n\n/**\n * Scheduler configuration.\n */\nexport const SCHEDULER_CONFIG = {\n // Infinite loop protection\n MAX_EXECUTIONS_PER_SECOND: 1000,\n MAX_EXECUTIONS_PER_EFFECT: 100,\n\n // Batch processing limits to prevent blocking the main thread for too long\n MAX_EXECUTIONS_PER_FLUSH: 10000,\n MAX_FLUSH_ITERATIONS: 1000,\n MIN_FLUSH_ITERATIONS: 10,\n\n // Memory management\n CLEANUP_THRESHOLD: 1000,\n BATCH_QUEUE_SHRINK_THRESHOLD: 1000,\n} as const;\n\n/**\n * Debugging thresholds.\n */\nexport const DEBUG_CONFIG = {\n MAX_DEPENDENCIES: 1000,\n WARN_INFINITE_LOOP: true,\n} as const;\n\n/**\n * V8 Small Integer (SMI) max value.\n */\nexport const SMI_MAX = 0x3fffffff;\n\n/**\n * Development environment flag.\n */\nexport const IS_DEV =\n (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production') ||\n (typeof __DEV__ !== 'undefined' && !!__DEV__);\n\n// Fallback declaration for __DEV__ if not present in environment\ndeclare const __DEV__: boolean;\n\nexport const EMPTY_ERROR_ARRAY: readonly Error[] = Object.freeze([]);\n","/**\n * Base error class.\n */\nexport class AtomError extends Error {\n readonly timestamp = new Date();\n\n constructor(\n message: string,\n public cause: Error | null = null,\n public recoverable = true\n ) {\n super(message);\n this.name = 'AtomError';\n }\n}\n\n/** Computed error. */\nexport class ComputedError extends AtomError {\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, true);\n this.name = 'ComputedError';\n }\n}\n\n/** Effect error. */\nexport class EffectError extends AtomError {\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, false);\n this.name = 'EffectError';\n }\n}\n\n/** Scheduler error. */\nexport class SchedulerError extends AtomError {\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, false);\n this.name = 'SchedulerError';\n }\n}\n","import { DEBUG_CONFIG, IS_DEV } from '@/constants';\nimport { ComputedError } from '@/errors/errors';\nimport type { DebugConfig, Dependency, DependencyId } from '@/types';\n\n// Debug symbols\nexport const DEBUG_NAME = Symbol('AtomEffect.DebugName');\nexport const DEBUG_ID = Symbol('AtomEffect.Id');\nexport const DEBUG_TYPE = Symbol('AtomEffect.Type');\nexport const NO_DEFAULT_VALUE = Symbol('AtomEffect.NoDefaultValue');\n\n/**\n * Dependency type guard.\n */\nconst hasDeps = (o: Dependency): o is Dependency & { dependencies: Dependency[] } =>\n 'dependencies' in o && Array.isArray((o as { dependencies: unknown }).dependencies);\n\n/**\n * Cycle detection.\n */\nfunction checkCircularInternal(dep: Dependency, current: object, visited: Set<number>): void {\n // Cycle detected in *this* path\n if (dep === current) {\n throw new ComputedError(\n 'Circular dependency detected: The computation refers to itself explicitly or implicitly.'\n );\n }\n\n // Cycle check\n if (visited.has(dep.id)) return;\n visited.add(dep.id);\n\n if (hasDeps(dep)) {\n const deps = dep.dependencies;\n // Check dependencies\n for (let i = 0; i < deps.length; i++) {\n const child = deps[i];\n if (child) {\n checkCircularInternal(child, current, visited);\n }\n }\n }\n}\n\n/**\n * Debug controller.\n */\nexport const debug: DebugConfig = {\n // Dev mode flag\n enabled: IS_DEV,\n\n maxDependencies: DEBUG_CONFIG.MAX_DEPENDENCIES,\n warnInfiniteLoop: DEBUG_CONFIG.WARN_INFINITE_LOOP,\n\n warn(cond, msg) {\n if (IS_DEV && this.enabled && cond) {\n console.warn(`[Atom Effect] ${msg}`);\n }\n },\n\n checkCircular(dep, current) {\n if (dep === current) {\n throw new ComputedError('Direct circular dependency detected');\n }\n\n if (IS_DEV && this.enabled) {\n checkCircularInternal(dep, current, new Set());\n }\n },\n\n attachDebugInfo(obj, type, id) {\n if (!IS_DEV || !this.enabled) return;\n\n const t = obj as Record<symbol, unknown>;\n t[DEBUG_NAME] = `${type}_${id}`;\n t[DEBUG_ID] = id;\n t[DEBUG_TYPE] = type;\n },\n\n getDebugName: (obj) =>\n (obj as Record<symbol, unknown> | null)?.[DEBUG_NAME] as string | undefined,\n\n getDebugType: (obj) =>\n (obj as Record<symbol, unknown> | null)?.[DEBUG_TYPE] as string | undefined,\n};\n\n/**\n * ID counter.\n */\nlet nextId = 1;\n\n/**\n * Generates ID.\n */\nexport const generateId = () => nextId++ as DependencyId;\n","import { NODE_FLAGS } from '@/constants';\nimport type { DependencySubscriber, Listener } from '@/tracking/tracking.types';\nimport type { Dependency, Subscriber } from '@/types';\nimport { debug } from '@/utils/debug';\n/**\n * Tracks dependency.\n */\nexport function trackDependency<T>(\n dependency: Dependency,\n current: Listener,\n subscribers: SubscriberLink<T>[]\n): void {\n if (typeof current === 'function') {\n const fn = current as (newValue?: T, oldValue?: T) => void;\n // Check for existing subscription\n for (let i = 0, len = subscribers.length; i < len; i++) {\n const link = subscribers[i];\n if (link && link.fn === fn) return;\n }\n subscribers.push(new SubscriberLink(fn, undefined));\n return;\n }\n\n if ('addDependency' in (current as object)) {\n (current as DependencySubscriber).addDependency(dependency);\n return;\n }\n\n const sub = current as Subscriber;\n for (let i = 0, len = subscribers.length; i < len; i++) {\n const link = subscribers[i];\n if (link && link.sub === sub) return;\n }\n subscribers.push(new SubscriberLink(undefined, sub));\n}\n\n/**\n * Syncs dependencies.\n */\nexport function syncDependencies(\n nextLinks: DependencyLink[],\n prevLinks: DependencyLink[],\n tracker: Subscriber\n): void {\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n const link = prevLinks[i];\n if (link) {\n link.node._tempUnsub = link.unsub;\n }\n }\n\n for (let i = 0, len = nextLinks.length; i < len; i++) {\n const link = nextLinks[i];\n if (!link) continue;\n\n const node = link.node;\n if (node._tempUnsub !== undefined) {\n // Re-link: Found in previous set, reclaim the subscription\n link.unsub = node._tempUnsub;\n node._tempUnsub = undefined; // Consumed\n } else {\n // New Link: Subscribe afresh\n debug.checkCircular(node, tracker);\n link.unsub = node.subscribe(tracker);\n }\n }\n\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n const link = prevLinks[i];\n if (link) {\n const node = link.node;\n if (node._tempUnsub !== undefined) {\n node._tempUnsub(); // Release\n node._tempUnsub = undefined;\n }\n link.unsub = undefined;\n }\n }\n}\n\n/**\n * Dependency graph edge.\n */\nexport class DependencyLink {\n public unsub: (() => void) | undefined;\n\n constructor(\n public node: Dependency,\n public version: number,\n unsub: (() => void) | undefined = undefined\n ) {\n // Always initialize to maintain consistent V8 hidden class\n this.unsub = unsub;\n }\n}\n\n/**\n * Subscriber link.\n */\nexport class SubscriberLink<T> {\n public fn: ((newValue?: T, oldValue?: T) => void) | undefined;\n public sub: Subscriber | undefined;\n\n constructor(fn: ((newValue?: T, oldValue?: T) => void) | undefined, sub: Subscriber | undefined) {\n // Always initialize both properties to maintain consistent V8 hidden class\n this.fn = fn;\n this.sub = sub;\n }\n}\n","/**\n * Error message registry.\n */\nexport const ERROR_MESSAGES = {\n // Computed Errors\n COMPUTED_MUST_BE_FUNCTION: 'Computed target must be a function',\n COMPUTED_ASYNC_PENDING_NO_DEFAULT: 'Async computation pending with no default value',\n COMPUTED_COMPUTATION_FAILED: 'Computation execution failed',\n COMPUTED_ASYNC_COMPUTATION_FAILED: 'Async computation execution failed',\n COMPUTED_CIRCULAR_DEPENDENCY: 'Circular dependency detected',\n COMPUTED_DISPOSED: 'Attempted to access disposed computed',\n\n // Atom Errors\n ATOM_SUBSCRIBER_MUST_BE_FUNCTION: 'Subscriber must be a function or Subscriber object',\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: 'Subscriber execution failed',\n\n // Effect Errors\n EFFECT_MUST_BE_FUNCTION: 'Effect target must be a function',\n EFFECT_EXECUTION_FAILED: 'Effect execution failed',\n EFFECT_CLEANUP_FAILED: 'Effect cleanup failed',\n EFFECT_DISPOSED: 'Attempted to run disposed effect',\n\n // System / Debug\n LARGE_DEPENDENCY_GRAPH: (count: number): string => `Large dependency graph (${count} nodes)`,\n CALLBACK_ERROR_IN_ERROR_HANDLER: 'Exception encountered in onError handler',\n} as const;\n","import { AtomError } from '@/errors/errors';\n\n/**\n * Wraps error.\n *\n * @param error - Raw error.\n * @param ErrorClass - Error class.\n * @param context - Error context.\n */\nexport function wrapError(\n error: unknown,\n ErrorClass: typeof AtomError,\n context: string\n): AtomError {\n // Return if wrapped\n if (error instanceof AtomError) {\n return error;\n }\n\n const isNativeError = error instanceof Error;\n const originalMessage = isNativeError ? error.message : String(error);\n const cause = isNativeError ? error : undefined;\n\n // Error category\n let type = 'Unexpected error';\n if (error instanceof TypeError) type = 'Type error';\n else if (error instanceof ReferenceError) type = 'Reference error';\n\n const finalMessage = `${type} (${context}): ${originalMessage}`;\n\n return new ErrorClass(finalMessage, cause);\n}\n","import { IS_DEV, NODE_FLAGS, SMI_MAX } from '@/constants';\nimport { SubscriberLink } from '@/core/dep-tracking';\nimport { AtomError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport type { DependencyId, Subscriber } from '@/types';\nimport { generateId } from '@/utils/debug';\nimport { wrapError } from '@/utils/error';\n\n/**\n * Base class for all reactive nodes.\n */\nexport class ReactiveNode {\n /** State flags */\n flags = 0;\n /** Version counter */\n version = 0;\n /** Last access epoch */\n _lastSeenEpoch = -1;\n /** Modified epoch */\n _modifiedAtEpoch = -1;\n /** Debug ID */\n readonly id: DependencyId = (generateId() & SMI_MAX) as DependencyId;\n /** Temporary unsubscribe slot */\n _tempUnsub: (() => void) | undefined = undefined;\n}\n\n/**\n * Reactive dependency base class.\n */\nexport abstract class ReactiveDependency<T> extends ReactiveNode {\n protected abstract _subscribers: SubscriberLink<T>[];\n\n /**\n * Adds subscriber.\n */\n subscribe(listener: ((newValue?: T, oldValue?: T) => void) | Subscriber): () => void {\n const isFn = typeof listener === 'function';\n // Validate subscriber\n if (!isFn && (!listener || typeof (listener as Subscriber).execute !== 'function')) {\n throw wrapError(\n new TypeError('Invalid subscriber'),\n AtomError,\n ERROR_MESSAGES.ATOM_SUBSCRIBER_MUST_BE_FUNCTION\n );\n }\n\n const subs = this._subscribers;\n for (let i = 0, len = subs.length; i < len; i++) {\n const sub = subs[i];\n if (!sub) continue;\n if (isFn ? sub.fn === listener : sub.sub === listener) {\n if (IS_DEV) console.warn('Duplicate subscription ignored.');\n return () => {};\n }\n }\n\n const link = new SubscriberLink<T>(\n isFn ? (listener as (newValue?: T, oldValue?: T) => void) : undefined,\n !isFn ? (listener as Subscriber) : undefined\n );\n\n subs.push(link);\n\n return () => this._unsubscribe(link);\n }\n\n private _unsubscribe(link: SubscriberLink<T>): void {\n const subs = this._subscribers;\n const idx = subs.indexOf(link);\n if (idx === -1) return;\n\n // Remove subscriber\n const last = subs.pop();\n if (idx < subs.length && last) {\n subs[idx] = last;\n }\n }\n\n subscriberCount(): number {\n return this._subscribers.length;\n }\n\n protected _notifySubscribers(newValue: T | undefined, oldValue: T | undefined): void {\n if (this._subscribers.length === 0) return;\n\n const subs = [...this._subscribers];\n const len = subs.length;\n\n for (let i = 0; i < len; i++) {\n const s = subs[i];\n if (!s) continue;\n try {\n if (s.fn) s.fn(newValue, oldValue);\n else if (s.sub) s.sub.execute();\n } catch (err) {\n this._handleNotifyError(err);\n }\n }\n }\n\n private _handleNotifyError(err: unknown): void {\n console.error(wrapError(err, AtomError, ERROR_MESSAGES.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED));\n }\n}\n","import { IS_DEV, SMI_MAX } from '@/constants';\n\n// Global epoch counter.\nlet collectorEpoch = 0;\n\n/**\n * Next tracking epoch.\n */\nexport const nextEpoch = () => {\n collectorEpoch = (collectorEpoch + 1) & SMI_MAX || 1;\n return collectorEpoch;\n};\n\n/** Current tracking epoch. */\nexport const currentEpoch = () => collectorEpoch;\n\nexport let flushEpoch = 0;\nexport let flushExecutionCount = 0;\nlet isFlushing = false;\n\n/**\n * Starts flush cycle.\n */\nexport function startFlush(): boolean {\n if (isFlushing) {\n if (IS_DEV) console.warn('startFlush() called during flush - ignored');\n return false;\n }\n\n isFlushing = true;\n flushEpoch = (flushEpoch + 1) & SMI_MAX || 1;\n flushExecutionCount = 0;\n return true;\n}\n\n/** Ends flush cycle. */\nexport const endFlush = () => {\n isFlushing = false;\n};\n\n/**\n * Increments execution count.\n */\nexport const incrementFlushExecutionCount = () => (isFlushing ? ++flushExecutionCount : 0);\n\n/**\n * Resets flush state.\n */\nexport function resetFlushState(): void {\n flushEpoch = 0;\n flushExecutionCount = 0;\n isFlushing = false;\n}\n","import { IS_DEV, SCHEDULER_CONFIG } from '@/constants';\nimport { SchedulerError } from '@/errors/errors';\nimport { endFlush, startFlush } from '@/internal/epoch';\n\nexport enum SchedulerPhase {\n IDLE = 0,\n BATCHING = 1,\n FLUSHING = 2,\n}\n\nexport interface SchedulerJob {\n (): void;\n /** Next scheduled epoch */\n _nextEpoch?: number;\n}\n\n/**\n * Scheduler implementation.\n */\nexport const scheduler = {\n /** Queue buffer */\n _queueBuffer: [[], []] as [SchedulerJob[], SchedulerJob[]],\n _bufferIndex: 0,\n _size: 0,\n\n /** Epoch counter */\n _epoch: 0,\n\n /** State flags */\n _isProcessing: false,\n _isBatching: false,\n _isFlushingSync: false,\n\n /** Batching state */\n _batchDepth: 0,\n _batchQueue: [] as SchedulerJob[],\n _batchQueueSize: 0,\n\n /** Config */\n _maxFlushIterations: SCHEDULER_CONFIG.MAX_FLUSH_ITERATIONS as number,\n\n get phase(): SchedulerPhase {\n if (this._isProcessing || this._isFlushingSync) return SchedulerPhase.FLUSHING;\n if (this._isBatching) return SchedulerPhase.BATCHING;\n return SchedulerPhase.IDLE;\n },\n\n get queueSize(): number {\n return this._size;\n },\n\n get isBatching(): boolean {\n return this._isBatching;\n },\n\n /**\n * Schedules job.\n */\n schedule(callback: SchedulerJob): void {\n if (IS_DEV && typeof callback !== 'function') {\n throw new SchedulerError('Scheduler callback must be a function');\n }\n\n // Deduplicate job\n if (callback._nextEpoch === this._epoch) return;\n callback._nextEpoch = this._epoch;\n\n if (this._isBatching || this._isFlushingSync) {\n this._batchQueue[this._batchQueueSize++] = callback;\n return;\n }\n\n // Push to current active buffer\n this._queueBuffer[this._bufferIndex]![this._size++] = callback;\n\n // Wake up if sleeping\n if (!this._isProcessing) {\n this._flush();\n }\n },\n\n /**\n * Triggers flush.\n */\n _flush(): void {\n if (this._isProcessing || this._size === 0) return;\n this._isProcessing = true;\n\n queueMicrotask(this._runLoop);\n },\n\n /**\n * Scheduler loop.\n */\n _runLoop: () => {\n try {\n if (scheduler._size === 0) return;\n\n const started = startFlush();\n scheduler._drainQueue();\n if (started) endFlush();\n } finally {\n scheduler._isProcessing = false;\n // If new jobs arrived during flush (and not batching), re-schedule\n if (scheduler._size > 0 && !scheduler._isBatching) {\n scheduler._flush();\n }\n }\n },\n\n _flushSync(): void {\n this._isFlushingSync = true;\n const started = startFlush();\n try {\n this._mergeBatchQueue();\n this._drainQueue();\n } finally {\n this._isFlushingSync = false;\n if (started) endFlush();\n }\n },\n\n _mergeBatchQueue(): void {\n if (this._batchQueueSize === 0) return;\n\n // Increment epoch\n const epoch = ++this._epoch;\n const bQueue = this._batchQueue;\n const targetBuffer = this._queueBuffer[this._bufferIndex]!;\n let currentSize = this._size;\n\n // Merge batch\n for (let i = 0; i < this._batchQueueSize; i++) {\n const job = bQueue[i]!;\n // Retag jobs\n if (job._nextEpoch !== epoch) {\n job._nextEpoch = epoch;\n targetBuffer[currentSize++] = job;\n }\n }\n\n this._size = currentSize;\n this._batchQueueSize = 0;\n\n // Resize batch queue\n if (bQueue.length > SCHEDULER_CONFIG.BATCH_QUEUE_SHRINK_THRESHOLD) {\n bQueue.length = 0;\n }\n },\n\n _drainQueue(): void {\n let iterations = 0;\n // Process queue\n while (this._size > 0) {\n // Overflow check\n if (++iterations > this._maxFlushIterations) {\n this._handleFlushOverflow();\n return;\n }\n\n this._processQueue();\n // If batch updates happened during processing, merge them in now\n this._mergeBatchQueue();\n }\n },\n\n _processQueue(): void {\n const idx = this._bufferIndex;\n const jobs = this._queueBuffer[idx]!;\n const count = this._size;\n\n // Swap buffers\n this._bufferIndex = idx ^ 1;\n this._size = 0;\n this._epoch++;\n\n for (let i = 0; i < count; i++) {\n // Execute job\n try {\n jobs[i]!();\n } catch (e) {\n console.error(new SchedulerError('Error occurred during scheduler execution', e as Error));\n }\n }\n // Clear the consumed buffer\n jobs.length = 0;\n },\n\n _handleFlushOverflow(): void {\n console.error(\n new SchedulerError(\n `Maximum flush iterations (${this._maxFlushIterations}) exceeded. Possible infinite loop.`\n )\n );\n this._size = 0;\n this._queueBuffer[this._bufferIndex]!.length = 0;\n this._batchQueueSize = 0;\n },\n\n startBatch(): void {\n this._batchDepth++;\n this._isBatching = true;\n },\n\n endBatch(): void {\n if (this._batchDepth === 0) {\n if (IS_DEV) console.warn('endBatch() called without matching startBatch(). Ignoring.');\n return;\n }\n\n if (--this._batchDepth === 0) {\n this._flushSync();\n this._isBatching = false;\n }\n },\n\n setMaxFlushIterations(max: number): void {\n if (max < SCHEDULER_CONFIG.MIN_FLUSH_ITERATIONS)\n throw new SchedulerError(\n `Max flush iterations must be at least ${SCHEDULER_CONFIG.MIN_FLUSH_ITERATIONS}`\n );\n this._maxFlushIterations = max;\n },\n};\n","import type { Listener } from './tracking.types';\n\n/**\n * Global tracking context.\n */\nexport const trackingContext = {\n /** Active listener. */\n current: null as Listener | null,\n\n /**\n * Executes in context.\n *\n * @param listener - The subscriber.\n * @param fn - The logic to execute.\n * @returns The result of `fn`.\n */\n run<T>(listener: Listener, fn: () => T): T {\n const prev = this.current;\n this.current = listener;\n try {\n return fn();\n } finally {\n this.current = prev;\n }\n },\n};\n\n/**\n * Tracking context type.\n */\nexport type ITrackingContext = typeof trackingContext;\n","import { trackingContext } from './context';\n\n/**\n * Untracked execution.\n *\n * @param fn - Function to execute.\n * @returns Result of `fn`.\n */\nexport function untracked<T>(fn: () => T): T {\n const prev = trackingContext.current;\n\n // Skip if untracked\n if (prev === null) return fn();\n\n trackingContext.current = null;\n try {\n return fn();\n } finally {\n trackingContext.current = prev;\n }\n}\n","import { ATOM_STATE_FLAGS, SMI_MAX } from '@/constants';\nimport { ReactiveDependency } from '@/core/base';\nimport { type SubscriberLink, trackDependency } from '@/core/dep-tracking';\nimport { scheduler } from '@/internal/scheduler';\nimport { trackingContext } from '@/tracking';\nimport type { AtomOptions, WritableAtom } from '@/types';\nimport { debug } from '@/utils/debug';\n\n/**\n * Internal {@link WritableAtom} implementation.\n */\nclass AtomImpl<T> extends ReactiveDependency<T> implements WritableAtom<T> {\n private _value: T;\n /** Old value for notifications */\n private _pendingOldValue: T | undefined = undefined;\n /** Cached notification task */\n private _notifyTask: (() => void) | undefined = undefined;\n protected _subscribers: SubscriberLink<T>[] = [];\n\n constructor(initialValue: T, sync: boolean) {\n super();\n this._value = initialValue;\n if (sync) this.flags |= ATOM_STATE_FLAGS.SYNC;\n debug.attachDebugInfo(this, 'atom', this.id);\n }\n\n get value(): T {\n const current = trackingContext.current;\n if (current) {\n trackDependency(this, current, this._subscribers);\n }\n return this._value;\n }\n\n set value(newValue: T) {\n const oldValue = this._value;\n if (Object.is(oldValue, newValue)) return;\n\n this._value = newValue;\n this.version = (this.version + 1) & SMI_MAX;\n\n const flags = this.flags;\n if (this._subscribers.length === 0 || flags & ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED) {\n return;\n }\n\n this._pendingOldValue = oldValue;\n this.flags = flags | ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED;\n\n // Sync handling\n if (flags & ATOM_STATE_FLAGS.SYNC && !scheduler.isBatching) {\n this._flushNotifications();\n return;\n }\n\n // Async scheduling\n if (!this._notifyTask) {\n // Create notification task\n this._notifyTask = () => this._flushNotifications();\n }\n scheduler.schedule(this._notifyTask);\n }\n\n /**\n * Triggers subscribers.\n */\n private _flushNotifications(): void {\n const flags = this.flags;\n // Guard: Spurious flush or already disposed\n if (!(flags & ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED) || flags & ATOM_STATE_FLAGS.DISPOSED) {\n return;\n }\n\n const oldValue = this._pendingOldValue as T;\n this._pendingOldValue = undefined;\n this.flags &= ~ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED;\n\n this._notifySubscribers(this._value, oldValue);\n }\n\n peek(): T {\n return this._value;\n }\n\n dispose(): void {\n if (this.flags & ATOM_STATE_FLAGS.DISPOSED) return;\n\n this._subscribers.length = 0;\n this.flags |= ATOM_STATE_FLAGS.DISPOSED;\n // Release references\n this._value = undefined as T;\n this._pendingOldValue = undefined;\n this._notifyTask = undefined;\n }\n}\n\n/**\n * Creates a reactive atom holding mutable state.\n *\n * @param initialValue - The initial value of the atom.\n * @param options - Configuration options (sync: boolean).\n */\nexport function atom<T>(initialValue: T, options: AtomOptions = {}): WritableAtom<T> {\n return new AtomImpl(initialValue, options.sync ?? false);\n}\n","import { IS_DEV } from '@/constants';\nimport type { PoolStats } from '@/types';\n\n/**\n * Array pool.\n *\n * @template T - Element type.\n */\nexport class ArrayPool<T> {\n private readonly pool: T[][] = [];\n\n // Mutable stats container, null in production\n private stats = IS_DEV\n ? {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 },\n }\n : null;\n\n /**\n * @param limit - Max unique arrays to hold (default: 50). Prevents the pool itself from consuming too much memory.\n * @param capacity - Max length of an array to accept (default: 256).\n */\n constructor(\n private readonly limit = 50,\n private readonly capacity = 256\n ) {}\n\n /**\n * Acquires array.\n */\n acquire(): T[] {\n if (IS_DEV && this.stats) {\n this.stats.acquired++;\n }\n // LIFO reuse for better cache locality\n return this.pool.pop() ?? [];\n }\n\n /**\n * Releases array.\n *\n * @param arr - Array to release.\n * @param emptyConst - Optional empty constant.\n */\n release(arr: T[], emptyConst?: readonly T[]): void {\n if (emptyConst && arr === emptyConst) return;\n\n if (arr.length > this.capacity) {\n if (IS_DEV && this.stats) this.stats.rejected.tooLarge++;\n return;\n }\n\n if (this.pool.length >= this.limit) {\n if (IS_DEV && this.stats) this.stats.rejected.poolFull++;\n return;\n }\n\n if (Object.isFrozen(arr)) {\n if (IS_DEV && this.stats) this.stats.rejected.frozen++;\n return;\n }\n\n arr.length = 0;\n this.pool.push(arr);\n\n if (IS_DEV && this.stats) {\n this.stats.released++;\n }\n }\n\n /**\n * Pool stats.\n */\n getStats(): PoolStats | null {\n if (!IS_DEV || !this.stats) return null;\n\n const { acquired, released, rejected } = this.stats;\n const leakCount =\n acquired - released - (rejected.frozen + rejected.tooLarge + rejected.poolFull);\n\n return {\n acquired,\n released,\n rejected: { ...rejected },\n leaked: leakCount,\n poolSize: this.pool.length,\n };\n }\n\n /**\n * Resets pool.\n */\n reset(): void {\n this.pool.length = 0;\n if (IS_DEV && this.stats) {\n this.stats = {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 },\n };\n }\n }\n}\n","import type { DependencyLink } from '@/core/dep-tracking';\nimport type { Dependency, Subscriber } from '@/types';\nimport { ArrayPool } from '@/utils/array-pool';\n\nconst freeze = <T>(arr: T[]): readonly T[] => Object.freeze(arr);\n\n// Empty constants\nexport const EMPTY_DEPS = freeze<Dependency>([]);\nexport const EMPTY_SUBS = freeze<Subscriber>([]);\nexport const EMPTY_UNSUBS = freeze<() => void>([]);\nexport const EMPTY_VERSIONS = freeze<number>([]);\nexport const EMPTY_LINKS = freeze<DependencyLink>([]);\n\n// Array pools\nexport const depArrayPool = new ArrayPool<Dependency>();\nexport const unsubArrayPool = new ArrayPool<() => void>();\nexport const versionArrayPool = new ArrayPool<number>();\nexport const linksArrayPool = new ArrayPool<DependencyLink>();\n","import type { ComputedAtom, EffectObject, ReadonlyAtom, WritableAtom } from '@/types';\n\n/**\n * Readonly atom check.\n *\n * @param obj - Object to check.\n */\nexport function isAtom(obj: unknown): obj is ReadonlyAtom {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n 'value' in obj &&\n typeof (obj as { subscribe?: unknown }).subscribe === 'function'\n );\n}\n\n/**\n * Writable atom check.\n */\nexport function isWritable(obj: unknown): obj is WritableAtom {\n return isAtom(obj) && typeof (obj as { dispose?: unknown }).dispose === 'function';\n}\n\n/**\n * Computed atom check.\n */\nexport function isComputed(obj: unknown): obj is ComputedAtom {\n return isAtom(obj) && typeof (obj as { invalidate?: unknown }).invalidate === 'function';\n}\n\n/**\n * Effect object check.\n */\nexport function isEffect(obj: unknown): obj is EffectObject {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n typeof (obj as { dispose?: unknown }).dispose === 'function' &&\n typeof (obj as { run?: unknown }).run === 'function'\n );\n}\n\n/**\n * Promise check.\n */\nexport function isPromise<T>(value: unknown): value is Promise<T> {\n return (\n value !== null &&\n typeof value === 'object' &&\n typeof (value as { then?: unknown }).then === 'function'\n );\n}\n","import { AsyncState, COMPUTED_STATE_FLAGS, EMPTY_ERROR_ARRAY, SMI_MAX } from '@/constants';\nimport { ReactiveDependency } from '@/core/base';\nimport {\n DependencyLink,\n type SubscriberLink,\n syncDependencies,\n trackDependency,\n} from '@/core/dep-tracking';\nimport { ComputedError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport { currentEpoch, nextEpoch } from '@/internal/epoch';\nimport { EMPTY_LINKS, linksArrayPool } from '@/internal/pool';\nimport { trackingContext } from '@/tracking';\nimport type {\n AsyncStateType,\n ComputedAtom,\n ComputedOptions,\n Dependency,\n Subscriber,\n} from '@/types';\nimport { debug, NO_DEFAULT_VALUE } from '@/utils/debug';\nimport { wrapError } from '@/utils/error';\nimport { isPromise } from '@/utils/type-guards';\n\n// Async state map\nconst ASYNC_STATE_MASK =\n COMPUTED_STATE_FLAGS.RESOLVED | COMPUTED_STATE_FLAGS.PENDING | COMPUTED_STATE_FLAGS.REJECTED;\nconst ASYNC_STATE_LOOKUP = Array(ASYNC_STATE_MASK + 1).fill(AsyncState.IDLE);\nASYNC_STATE_LOOKUP[COMPUTED_STATE_FLAGS.RESOLVED] = AsyncState.RESOLVED;\nASYNC_STATE_LOOKUP[COMPUTED_STATE_FLAGS.PENDING] = AsyncState.PENDING;\nASYNC_STATE_LOOKUP[COMPUTED_STATE_FLAGS.REJECTED] = AsyncState.REJECTED;\n\nconst MAX_ASYNC_RETRIES = 3;\nconst MAX_PROMISE_ID = Number.MAX_SAFE_INTEGER - 1;\n\n/**\n * Computed atom implementation.\n */\nclass ComputedAtomImpl<T> extends ReactiveDependency<T> implements ComputedAtom<T>, Subscriber {\n private _value: T;\n private _error: Error | null = null;\n /** Promise tracking ID */\n private _promiseId = 0;\n\n private readonly _equal: (a: T, b: T) => boolean;\n private readonly _fn: () => T | Promise<T>;\n private readonly _defaultValue: T;\n private readonly _onError: ((error: Error) => void) | null;\n\n protected _subscribers: SubscriberLink<T>[] = [];\n private _links: DependencyLink[] = EMPTY_LINKS as unknown as DependencyLink[];\n\n /** Error cache */\n private _cachedErrors: readonly Error[] | null = null;\n private _errorCacheEpoch = -1;\n\n // Async state\n private _asyncStartAggregateVersion = 0;\n private _asyncRetryCount = 0;\n\n // Dependency collection state\n private _trackEpoch = -1;\n private _trackLinks: DependencyLink[] = EMPTY_LINKS as unknown as DependencyLink[];\n private _trackCount = 0;\n\n constructor(fn: () => T | Promise<T>, options: ComputedOptions<T> = {}) {\n if (typeof fn !== 'function') throw new ComputedError(ERROR_MESSAGES.COMPUTED_MUST_BE_FUNCTION);\n super();\n\n this._value = undefined as T;\n // Start dirty so first access triggers computation\n this.flags = COMPUTED_STATE_FLAGS.DIRTY | COMPUTED_STATE_FLAGS.IDLE;\n this._equal = options.equal ?? Object.is;\n this._fn = fn;\n this._defaultValue = 'defaultValue' in options ? options.defaultValue : (NO_DEFAULT_VALUE as T);\n this._onError = options.onError ?? null;\n\n debug.attachDebugInfo(this, 'computed', this.id);\n\n // Eager evaluation if not lazy\n if (options.lazy === false) {\n try {\n this._recompute();\n } catch {} // Ignore error during eager init, it will be captured later\n }\n }\n\n private _track(): void {\n const current = trackingContext.current;\n if (current) trackDependency(this, current, this._subscribers);\n }\n\n get value(): T {\n this._track();\n\n const flags = this.flags;\n if (\n (flags &\n (COMPUTED_STATE_FLAGS.RESOLVED |\n COMPUTED_STATE_FLAGS.DIRTY |\n COMPUTED_STATE_FLAGS.IDLE)) ===\n COMPUTED_STATE_FLAGS.RESOLVED\n ) {\n return this._value;\n }\n\n if (flags & COMPUTED_STATE_FLAGS.DISPOSED) {\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_DISPOSED);\n }\n\n if (flags & COMPUTED_STATE_FLAGS.RECOMPUTING) {\n if (this._defaultValue !== (NO_DEFAULT_VALUE as T)) return this._defaultValue;\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_CIRCULAR_DEPENDENCY);\n }\n\n if (flags & (COMPUTED_STATE_FLAGS.DIRTY | COMPUTED_STATE_FLAGS.IDLE)) {\n this._recompute();\n // Re-read flags after update\n if (this.flags & COMPUTED_STATE_FLAGS.RESOLVED) return this._value;\n }\n\n // 3. Async/Error handling\n const def = this._defaultValue;\n const hasDef = def !== (NO_DEFAULT_VALUE as T);\n\n if (this.flags & COMPUTED_STATE_FLAGS.PENDING) {\n if (hasDef) return def;\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n\n if (this.flags & COMPUTED_STATE_FLAGS.REJECTED) {\n if ((this._error as ComputedError)?.recoverable && hasDef) return def;\n throw this._error;\n }\n\n return this._value;\n }\n\n peek(): T {\n return this._value;\n }\n\n get state(): AsyncStateType {\n this._track();\n return ASYNC_STATE_LOOKUP[this.flags & ASYNC_STATE_MASK];\n }\n\n get hasError(): boolean {\n this._track();\n if (this.flags & (COMPUTED_STATE_FLAGS.REJECTED | COMPUTED_STATE_FLAGS.HAS_ERROR)) return true;\n\n // Check dependencies\n const links = this._links;\n for (let i = 0, len = links.length; i < len; i++) {\n const node = links[i]?.node;\n if (node && node.flags & COMPUTED_STATE_FLAGS.HAS_ERROR) return true;\n }\n return false;\n }\n\n // ... (isValid, errors, lastError getters remain structurally similar, omitted for brevity if mostly unchanged) ...\n get isValid(): boolean {\n return !this.hasError;\n }\n\n get errors(): readonly Error[] {\n this._track();\n if (!this.hasError) return EMPTY_ERROR_ARRAY;\n\n const epoch = currentEpoch();\n if (this._errorCacheEpoch === epoch && this._cachedErrors) return this._cachedErrors;\n\n // Collect errors directly into array, dedupe via indexOf (avoids Set allocation)\n const collected: Error[] = [];\n if (this._error) collected.push(this._error);\n\n const links = this._links;\n for (let i = 0, len = links.length; i < len; i++) {\n const dep = links[i]!.node;\n if (dep.flags & COMPUTED_STATE_FLAGS.HAS_ERROR) {\n const computedDep = dep as unknown as ComputedAtom<unknown>;\n if (computedDep.errors) {\n const depErrors = computedDep.errors;\n for (let j = 0; j < depErrors.length; j++) {\n const err = depErrors[j];\n if (err && collected.indexOf(err) === -1) collected.push(err);\n }\n }\n }\n }\n\n const errors = Object.freeze(collected);\n this._errorCacheEpoch = epoch;\n this._cachedErrors = errors;\n return errors;\n }\n\n get lastError(): Error | null {\n this._track();\n return this._error;\n }\n\n get isPending(): boolean {\n this._track();\n return (this.flags & COMPUTED_STATE_FLAGS.PENDING) !== 0;\n }\n\n get isResolved(): boolean {\n this._track();\n return (this.flags & COMPUTED_STATE_FLAGS.RESOLVED) !== 0;\n }\n\n invalidate(): void {\n this._markDirty();\n this._errorCacheEpoch = -1;\n this._cachedErrors = null;\n }\n\n dispose(): void {\n if (this.flags & COMPUTED_STATE_FLAGS.DISPOSED) return;\n\n const links = this._links;\n if (links !== EMPTY_LINKS) {\n for (let i = 0, len = links.length; i < len; i++) {\n links[i]!.unsub?.();\n }\n linksArrayPool.release(links);\n this._links = EMPTY_LINKS as unknown as DependencyLink[];\n }\n\n this._subscribers.length = 0;\n this.flags =\n COMPUTED_STATE_FLAGS.DISPOSED | COMPUTED_STATE_FLAGS.DIRTY | COMPUTED_STATE_FLAGS.IDLE;\n\n // Release Memory\n this._error = null;\n this._value = undefined as T;\n this._promiseId = (this._promiseId + 1) % MAX_PROMISE_ID;\n this._cachedErrors = null;\n this._errorCacheEpoch = -1;\n }\n\n addDependency(dep: Dependency): void {\n // Deduplicate dependencies\n if (dep._lastSeenEpoch === this._trackEpoch) return;\n dep._lastSeenEpoch = this._trackEpoch;\n\n // Resize array if needed\n if (this._trackCount < this._trackLinks.length) {\n const link = this._trackLinks[this._trackCount]!;\n link.node = dep;\n link.version = dep.version;\n } else {\n this._trackLinks.push(new DependencyLink(dep, dep.version));\n }\n this._trackCount++;\n }\n\n private _commitDeps(prevLinks: DependencyLink[]): void {\n // Sync dependencies\n this._trackLinks.length = this._trackCount;\n syncDependencies(this._trackLinks, prevLinks, this);\n this._links = this._trackLinks;\n }\n\n private _recompute(): void {\n if (this.flags & COMPUTED_STATE_FLAGS.RECOMPUTING) return;\n this.flags |= COMPUTED_STATE_FLAGS.RECOMPUTING;\n\n const prevLinks = this._links;\n this._trackEpoch = nextEpoch();\n this._trackLinks = linksArrayPool.acquire();\n this._trackCount = 0;\n\n let committed = false;\n try {\n // Execute function\n const result = trackingContext.run(this, this._fn);\n\n this._commitDeps(prevLinks);\n committed = true;\n\n // Handle Result\n if (isPromise(result)) {\n this._handleAsyncComputation(result);\n } else {\n this._finalizeResolution(result);\n }\n } catch (e) {\n // Commit dependencies on error\n if (!committed) {\n try {\n this._commitDeps(prevLinks);\n committed = true;\n } catch {}\n }\n this._handleError(e as Error, ERROR_MESSAGES.COMPUTED_COMPUTATION_FAILED, true);\n } finally {\n // Release pool\n if (committed && prevLinks !== EMPTY_LINKS) {\n linksArrayPool.release(prevLinks);\n } else if (!committed) {\n linksArrayPool.release(this._trackLinks);\n }\n\n // Reset transient state\n this._trackEpoch = -1;\n this._trackLinks = EMPTY_LINKS as unknown as DependencyLink[];\n this._trackCount = 0;\n this.flags &= ~COMPUTED_STATE_FLAGS.RECOMPUTING;\n }\n }\n\n private _handleAsyncComputation(promise: Promise<T>): void {\n this.flags =\n (this.flags | COMPUTED_STATE_FLAGS.PENDING) &\n ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.DIRTY |\n COMPUTED_STATE_FLAGS.RESOLVED |\n COMPUTED_STATE_FLAGS.REJECTED\n );\n // Notify pending\n this._notifySubscribers(undefined, undefined);\n\n this._asyncStartAggregateVersion = this._captureVersionSnapshot();\n this._asyncRetryCount = 0;\n // Invalidate old promises\n this._promiseId = (this._promiseId + 1) % MAX_PROMISE_ID;\n const promiseId = this._promiseId;\n\n promise.then(\n (res) => {\n if (promiseId !== this._promiseId) return; // Stale\n\n // Check for stale reads (did deps change while we waited?)\n if (this._captureVersionSnapshot() !== this._asyncStartAggregateVersion) {\n if (this._asyncRetryCount++ < MAX_ASYNC_RETRIES) {\n return this._markDirty(); // Retry\n }\n return this._handleError(\n new ComputedError(`Async drift threshold exceeded after ${MAX_ASYNC_RETRIES} retries.`),\n ERROR_MESSAGES.COMPUTED_ASYNC_COMPUTATION_FAILED\n );\n }\n\n this._finalizeResolution(res);\n this._notifySubscribers(res, undefined);\n },\n (err) =>\n promiseId === this._promiseId &&\n this._handleError(err, ERROR_MESSAGES.COMPUTED_ASYNC_COMPUTATION_FAILED)\n );\n }\n\n private _captureVersionSnapshot(): number {\n let aggregate = 0;\n const links = this._links;\n for (let i = 0, len = links.length; i < len; i++) {\n // Hash mixing\n aggregate = ((((aggregate << 5) - aggregate) | 0) + links[i]!.node.version) & SMI_MAX;\n }\n return aggregate;\n }\n\n private _handleError(err: unknown, msg: string, throwErr = false): void {\n const error = wrapError(err, ComputedError, msg);\n\n if (!throwErr && !(this.flags & COMPUTED_STATE_FLAGS.REJECTED)) {\n // Update version\n this.version = (this.version + 1) & SMI_MAX;\n }\n\n this._error = error;\n this.flags =\n (this.flags &\n ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.DIRTY |\n COMPUTED_STATE_FLAGS.PENDING |\n COMPUTED_STATE_FLAGS.RESOLVED\n )) |\n (COMPUTED_STATE_FLAGS.REJECTED | COMPUTED_STATE_FLAGS.HAS_ERROR);\n\n if (this._onError) {\n try {\n this._onError(error);\n } catch (e) {\n console.error(ERROR_MESSAGES.CALLBACK_ERROR_IN_ERROR_HANDLER, e);\n }\n }\n\n if (throwErr) throw error;\n this._notifySubscribers(undefined, undefined);\n }\n\n private _finalizeResolution(value: T): void {\n // Only bump version if value actually changed or first resolve\n if (!(this.flags & COMPUTED_STATE_FLAGS.RESOLVED) || !this._equal(this._value, value)) {\n this.version = (this.version + 1) & SMI_MAX;\n }\n\n this._value = value;\n this._error = null;\n this.flags =\n (this.flags | COMPUTED_STATE_FLAGS.RESOLVED) &\n ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.DIRTY |\n COMPUTED_STATE_FLAGS.PENDING |\n COMPUTED_STATE_FLAGS.REJECTED |\n COMPUTED_STATE_FLAGS.HAS_ERROR\n );\n\n this._cachedErrors = null;\n this._errorCacheEpoch = -1;\n }\n\n execute(): void {\n // Subscriber implementation\n this._markDirty();\n }\n\n /** @internal */\n _markDirty(): void {\n if (this.flags & (COMPUTED_STATE_FLAGS.RECOMPUTING | COMPUTED_STATE_FLAGS.DIRTY)) return;\n this.flags |= COMPUTED_STATE_FLAGS.DIRTY;\n this._notifySubscribers(undefined, undefined);\n }\n}\n\nObject.freeze(ComputedAtomImpl.prototype);\n\n/**\n * Creates a computed value.\n * @param fn - Computation function\n * @param options - Options object\n */\nexport function computed<T>(fn: () => T, options?: ComputedOptions<T>): ComputedAtom<T>;\nexport function computed<T>(\n fn: () => Promise<T>,\n options: ComputedOptions<T> & { defaultValue: T }\n): ComputedAtom<T>;\nexport function computed<T>(\n fn: () => T | Promise<T>,\n options: ComputedOptions<T> = {}\n): ComputedAtom<T> {\n return new ComputedAtomImpl(fn, options);\n}\n","import { EFFECT_STATE_FLAGS, IS_DEV, SCHEDULER_CONFIG, TIME_CONSTANTS } from '@/constants';\nimport { ReactiveNode } from '@/core/base';\nimport { DependencyLink } from '@/core/dep-tracking';\nimport { EffectError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport {\n flushEpoch,\n flushExecutionCount,\n incrementFlushExecutionCount,\n nextEpoch,\n} from '@/internal/epoch';\nimport { EMPTY_LINKS, linksArrayPool } from '@/internal/pool';\nimport { scheduler } from '@/internal/scheduler';\nimport { type DependencyTracker, trackingContext } from '@/tracking';\nimport type { Dependency, EffectFunction, EffectObject, EffectOptions } from '@/types';\nimport { debug } from '@/utils/debug';\nimport { wrapError } from '@/utils/error';\nimport { isPromise } from '@/utils/type-guards';\n\n/**\n * Effect implementation.\n */\nclass EffectImpl extends ReactiveNode implements EffectObject, DependencyTracker {\n private _cleanup: (() => void) | null = null;\n private _links: DependencyLink[] = EMPTY_LINKS as unknown as DependencyLink[];\n private _nextLinks: DependencyLink[] | null = null;\n private _executeTask: (() => void) | undefined;\n\n private readonly _onError: ((error: unknown) => void) | null;\n\n // Cycle detection\n private _currentEpoch = -1;\n private _lastFlushEpoch = -1;\n private _executionsInEpoch = 0;\n\n private readonly _fn: EffectFunction;\n private readonly _sync: boolean;\n private readonly _maxExecutions: number;\n private readonly _maxExecutionsPerFlush: number;\n private readonly _trackModifications: boolean;\n\n // Execution history (Dev)\n private _history: number[] | null;\n private _executionCount = 0;\n private _historyPtr = 0;\n private readonly _historyCapacity: number;\n private _execId = 0;\n\n constructor(fn: EffectFunction, options: EffectOptions = {}) {\n super();\n this._fn = fn;\n this._onError = options.onError ?? null;\n this._sync = options.sync ?? false;\n this._maxExecutions =\n options.maxExecutionsPerSecond ?? SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_SECOND;\n this._maxExecutionsPerFlush =\n options.maxExecutionsPerFlush ?? SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_EFFECT;\n this._trackModifications = options.trackModifications ?? false;\n\n // Initialize history buffer\n const isFiniteLimit = Number.isFinite(this._maxExecutions);\n const capacity = isFiniteLimit\n ? Math.min(this._maxExecutions + 1, SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_SECOND + 1)\n : 0;\n this._historyCapacity = capacity;\n this._history = IS_DEV && isFiniteLimit && capacity > 0 ? new Array(capacity).fill(0) : null;\n\n debug.attachDebugInfo(this, 'effect', this.id);\n }\n\n public run(): void {\n if (this.flags & EFFECT_STATE_FLAGS.DISPOSED) {\n throw new EffectError(ERROR_MESSAGES.EFFECT_DISPOSED);\n }\n this.execute(true);\n }\n\n public dispose(): void {\n if (this.flags & EFFECT_STATE_FLAGS.DISPOSED) return;\n this.flags |= EFFECT_STATE_FLAGS.DISPOSED;\n\n this._execCleanup();\n this._releaseLinks(this._links);\n\n // Reset State\n this._links = EMPTY_LINKS as unknown as DependencyLink[];\n this._executeTask = undefined;\n }\n\n public addDependency(dep: Dependency): void {\n // Only track if currently executing (double check)\n if (!(this.flags & EFFECT_STATE_FLAGS.EXECUTING)) return;\n\n // Deduplicate in current epoch\n if (dep._lastSeenEpoch === this._currentEpoch) return;\n dep._lastSeenEpoch = this._currentEpoch;\n\n const nextLinks = this._nextLinks!;\n\n if (dep._tempUnsub) {\n nextLinks.push(new DependencyLink(dep, dep.version, dep._tempUnsub));\n dep._tempUnsub = undefined;\n return;\n }\n\n try {\n const unsubscribe = dep.subscribe(() => {\n if (this._trackModifications && this.flags & EFFECT_STATE_FLAGS.EXECUTING)\n dep._modifiedAtEpoch = this._currentEpoch;\n\n if (this._sync) return this.execute();\n\n // Task creation\n if (!this._executeTask) this._executeTask = () => this.execute();\n scheduler.schedule(this._executeTask!);\n });\n nextLinks.push(new DependencyLink(dep, dep.version, unsubscribe));\n } catch (error) {\n console.error(wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_EXECUTION_FAILED));\n }\n }\n\n /**\n * Executes effect with tracking.\n */\n public execute(force = false): void {\n if (this.flags & (EFFECT_STATE_FLAGS.DISPOSED | EFFECT_STATE_FLAGS.EXECUTING)) return;\n\n // Skip if not dirty\n if (!force && this._links.length > 0 && !this._isDirty()) return;\n\n this._checkInfiniteLoops();\n\n this.flags |= EFFECT_STATE_FLAGS.EXECUTING;\n this._execCleanup();\n\n const prevLinks = this._links;\n // Park subscriptions\n if (prevLinks !== EMPTY_LINKS) {\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n const link = prevLinks[i];\n if (link) link.node._tempUnsub = link.unsub;\n }\n }\n\n // Setup tracking\n const nextLinks = linksArrayPool.acquire();\n this._nextLinks = nextLinks;\n this._currentEpoch = nextEpoch();\n\n let committed = false;\n try {\n const result = trackingContext.run(this, this._fn);\n this._links = nextLinks;\n committed = true;\n\n this._checkLoopWarnings();\n\n // Handle result\n if (isPromise(result)) {\n this._handleAsyncResult(result);\n } else {\n this._cleanup = typeof result === 'function' ? result : null;\n }\n } catch (error) {\n // Commit on error\n committed = true;\n this._handleExecutionError(error);\n this._cleanup = null;\n } finally {\n this._finalizeDependencies(committed, prevLinks, nextLinks);\n this.flags &= ~EFFECT_STATE_FLAGS.EXECUTING;\n }\n }\n\n private _handleAsyncResult(promise: Promise<unknown>): void {\n const execId = ++this._execId;\n promise.then(\n (cleanup) => {\n // Guard against race conditions (new execution or disposal happened)\n if (execId !== this._execId || this.flags & EFFECT_STATE_FLAGS.DISPOSED) {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (e) {\n this._handleExecutionError(e, ERROR_MESSAGES.EFFECT_CLEANUP_FAILED);\n }\n }\n return;\n }\n if (typeof cleanup === 'function') this._cleanup = cleanup as () => void;\n },\n (err) => execId === this._execId && this._handleExecutionError(err)\n );\n }\n\n private _finalizeDependencies(\n committed: boolean,\n prevLinks: DependencyLink[],\n nextLinks: DependencyLink[]\n ): void {\n this._nextLinks = null;\n\n if (committed) {\n // Cleanup unused subscriptions\n if (prevLinks !== EMPTY_LINKS) {\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n const link = prevLinks[i];\n const unsub = link?.node._tempUnsub;\n if (unsub) {\n unsub();\n if (link) link.node._tempUnsub = undefined;\n }\n }\n linksArrayPool.release(prevLinks);\n }\n } else {\n // Abort and restore\n this._releaseLinks(nextLinks);\n linksArrayPool.release(nextLinks);\n\n if (prevLinks !== EMPTY_LINKS) {\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n // Clear park slots\n if (prevLinks[i]) prevLinks[i]!.node._tempUnsub = undefined;\n }\n }\n }\n }\n\n private _releaseLinks(links: DependencyLink[]): void {\n if (links === EMPTY_LINKS) return;\n for (let i = 0, len = links.length; i < len; i++) {\n links[i]?.unsub?.();\n }\n linksArrayPool.release(links);\n }\n\n private _isDirty(): boolean {\n const links = this._links;\n // Save tracking context once, restore at end (avoids per-iteration function allocation)\n const prevContext = trackingContext.current;\n trackingContext.current = null;\n\n try {\n for (let i = 0, len = links.length; i < len; i++) {\n const link = links[i]!;\n const dep = link.node;\n // Version Check\n if (dep.version !== link.version) return true;\n\n // Check computed values (read to trigger recomputation if needed)\n if ('value' in (dep as object)) {\n try {\n // Access value directly since we've disabled tracking\n void (dep as { value: unknown }).value;\n } catch {\n return true; // Error usually implies dirty/re-eval needed\n }\n if (dep.version !== link.version) return true;\n }\n }\n return false;\n } finally {\n trackingContext.current = prevContext;\n }\n }\n\n private _execCleanup(): void {\n if (!this._cleanup) return;\n try {\n this._cleanup();\n } catch (error) {\n this._handleExecutionError(error, ERROR_MESSAGES.EFFECT_CLEANUP_FAILED);\n }\n this._cleanup = null;\n }\n\n private _checkInfiniteLoops(): void {\n const epoch = flushEpoch;\n if (this._lastFlushEpoch !== epoch) {\n this._lastFlushEpoch = epoch;\n this._executionsInEpoch = 0;\n }\n\n if (++this._executionsInEpoch > this._maxExecutionsPerFlush)\n this._throwInfiniteLoopError('per-effect');\n if (incrementFlushExecutionCount() > SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_FLUSH)\n this._throwInfiniteLoopError('global');\n\n this._executionCount++;\n\n // Frequency check\n if (this._history) {\n const now = Date.now();\n this._history[this._historyPtr] = now;\n this._historyPtr = (this._historyPtr + 1) % this._historyCapacity;\n const oldest = this._history[this._historyPtr] || 0;\n\n if (oldest > 0 && now - oldest < TIME_CONSTANTS.ONE_SECOND_MS) {\n const err = new EffectError(\n `Effect executed too frequently within 1 second. Suspected infinite loop.`\n );\n this.dispose();\n this._handleExecutionError(err);\n if (IS_DEV) throw err;\n }\n }\n }\n\n get isDisposed(): boolean {\n return (this.flags & EFFECT_STATE_FLAGS.DISPOSED) !== 0;\n }\n get executionCount(): number {\n return this._executionCount;\n }\n get isExecuting(): boolean {\n return (this.flags & EFFECT_STATE_FLAGS.EXECUTING) !== 0;\n }\n\n private _throwInfiniteLoopError(type: 'per-effect' | 'global'): never {\n const error = new EffectError(\n `Infinite loop detected (${type}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${flushExecutionCount}`\n );\n this.dispose();\n console.error(error);\n throw error;\n }\n\n private _handleExecutionError(\n error: unknown,\n message: string = ERROR_MESSAGES.EFFECT_EXECUTION_FAILED\n ): void {\n const errorObj = wrapError(error, EffectError, message);\n console.error(errorObj);\n if (this._onError) {\n try {\n this._onError(errorObj);\n } catch (e) {\n console.error(wrapError(e, EffectError, ERROR_MESSAGES.CALLBACK_ERROR_IN_ERROR_HANDLER));\n }\n }\n }\n\n private _checkLoopWarnings(): void {\n if (this._trackModifications && debug.enabled) {\n const epoch = this._currentEpoch;\n const links = this._links;\n for (let i = 0, len = links.length; i < len; i++) {\n const dep = links[i]!.node;\n if (dep._modifiedAtEpoch === epoch) {\n debug.warn(\n true,\n `Effect is reading a dependency (${debug.getDebugName(dep) || 'unknown'}) that it just modified. Infinite loop may occur`\n );\n }\n }\n }\n }\n}\n\n/**\n * Creates and starts an effect.\n *\n * @param fn - Effect function.\n * @param options - Configuration options.\n * @returns Effect instance.\n */\nexport function effect(fn: EffectFunction, options: EffectOptions = {}): EffectObject {\n if (typeof fn !== 'function') {\n throw new EffectError(ERROR_MESSAGES.EFFECT_MUST_BE_FUNCTION);\n }\n\n const effectInstance = new EffectImpl(fn, options);\n effectInstance.execute();\n\n return effectInstance;\n}\n","import { scheduler } from './scheduler';\n\n/**\n * Batches updates.\n *\n * @param fn - Batch function.\n * @returns - Result of `fn`.\n */\nexport function batch<T>(fn: () => T): T {\n // Validate callback\n if (typeof fn !== 'function') {\n throw new TypeError('Batch callback must be a function');\n }\n\n scheduler.startBatch();\n try {\n return fn();\n } finally {\n scheduler.endBatch();\n }\n}\n"],"names":["TIME_CONSTANTS","AsyncState","NODE_FLAGS","EFFECT_STATE_FLAGS","COMPUTED_STATE_FLAGS","ATOM_STATE_FLAGS","POOL_CONFIG","SCHEDULER_CONFIG","DEBUG_CONFIG","SMI_MAX","IS_DEV","EMPTY_ERROR_ARRAY","AtomError","message","cause","recoverable","ComputedError","EffectError","SchedulerError","DEBUG_NAME","DEBUG_ID","DEBUG_TYPE","NO_DEFAULT_VALUE","hasDeps","o","checkCircularInternal","dep","current","visited","deps","i","child","debug","cond","msg","obj","type","id","t","nextId","generateId","trackDependency","dependency","subscribers","fn","len","link","SubscriberLink","sub","syncDependencies","nextLinks","prevLinks","tracker","node","DependencyLink","version","unsub","ERROR_MESSAGES","wrapError","error","ErrorClass","context","isNativeError","originalMessage","finalMessage","ReactiveNode","ReactiveDependency","listener","isFn","subs","idx","last","newValue","oldValue","s","err","collectorEpoch","nextEpoch","currentEpoch","flushEpoch","flushExecutionCount","isFlushing","startFlush","endFlush","incrementFlushExecutionCount","scheduler","callback","started","epoch","bQueue","targetBuffer","currentSize","job","iterations","jobs","count","e","max","trackingContext","prev","untracked","AtomImpl","initialValue","sync","flags","atom","options","ArrayPool","limit","capacity","arr","emptyConst","acquired","released","rejected","leakCount","freeze","EMPTY_LINKS","linksArrayPool","isAtom","isComputed","isEffect","isPromise","value","ASYNC_STATE_MASK","ASYNC_STATE_LOOKUP","MAX_ASYNC_RETRIES","MAX_PROMISE_ID","ComputedAtomImpl","def","hasDef","links","collected","computedDep","depErrors","j","errors","committed","result","promise","promiseId","res","aggregate","throwErr","computed","EffectImpl","isFiniteLimit","unsubscribe","force","execId","cleanup","prevContext","now","oldest","errorObj","effect","effectInstance","batch"],"mappings":"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"}
|