@but212/atom-effect 0.21.3 → 0.22.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.
@@ -1,2 +1,2 @@
1
- (function(h,f){typeof exports=="object"&&typeof module<"u"?f(exports):typeof define=="function"&&define.amd?define(["exports"],f):(h=typeof globalThis<"u"?globalThis:h||self,f(h.AtomEffect={}))})(this,(function(h){"use strict";const f={IDLE:"idle",PENDING:"pending",RESOLVED:"resolved",REJECTED:"rejected"},_={DISPOSED:1,EXECUTING:8},j={DISPOSED:1,IS_COMPUTED:2,DIRTY:8,IDLE:16,PENDING:32,RESOLVED:64,REJECTED:128,RECOMPUTING:256,HAS_ERROR:512},E={DISPOSED:1,SYNC:8,NOTIFICATION_SCHEDULED:16},ct={MAX_SIZE:1e3,WARMUP_SIZE:100,ENABLE_STATS:!1},d={MAX_EXECUTIONS_PER_SECOND:1e3,MAX_EXECUTIONS_PER_EFFECT:100,MAX_EXECUTIONS_PER_FLUSH:1e4,MAX_FLUSH_ITERATIONS:1e3,MIN_FLUSH_ITERATIONS:10,BATCH_QUEUE_SHRINK_THRESHOLD:1e3},Y={WARN_INFINITE_LOOP:!0,EFFECT_FREQUENCY_WINDOW:1e3},q={MAX_ASYNC_RETRIES:3,MAX_PROMISE_ID:Number.MAX_SAFE_INTEGER-1},P=1073741823,$=typeof process<"u"&&process.env&&!1||!1,ut=Object.freeze([]);class p extends Error{constructor(t,e=null,s=!0){super(t),this.cause=e,this.recoverable=s,this.name="AtomError"}}class I extends p{constructor(t,e=null){super(t,e,!0),this.name="ComputedError"}}class g extends p{constructor(t,e=null){super(t,e,!1),this.name="EffectError"}}class R extends p{constructor(t,e=null){super(t,e,!1),this.name="SchedulerError"}}const lt=Symbol("AtomEffect.DebugName"),_t=Symbol("AtomEffect.Type"),v=Symbol("AtomEffect.NoDefaultValue"),A={enabled:$,warnInfiniteLoop:Y.WARN_INFINITE_LOOP,warn(i,t){},checkCircular(i,t){if(i===t)throw new I("Direct circular dependency detected")},attachDebugInfo(i,t,e){},getDebugName:i=>i?.[lt],getDebugType:i=>i?.[_t]};let at=1;const ft=()=>at++;function W(i,t,e){if(typeof t=="function"){const n=t;for(let r=0,o=e.length;r<o;r++){const c=e[r];if(c&&c.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 o=e[n];if(o&&o.sub===s)return}e.push(new M(void 0,s))}function K(i,t,e){const s=new Map;for(let n=0,r=t.length;n<r;n++){const o=t[n];o?.unsub&&s.set(o.node,o.unsub)}for(let n=0,r=i.length;n<r;n++){const o=i[n];if(!o)continue;const c=o.node,b=s.get(c);b!==void 0?(o.unsub=b,s.delete(c)):(A.checkCircular(c,e),o.unsub=c.subscribe(e))}for(const n of s.values())n()}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 u={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",SCHEDULER_FLUSH_OVERFLOW:(i,t)=>`Maximum flush iterations (${i}) exceeded. ${t} jobs dropped. Possible infinite loop.`,CALLBACK_ERROR_IN_ERROR_HANDLER:"Exception encountered in onError handler",EFFECT_FREQUENCY_LIMIT_EXCEEDED:"Effect executed too frequently within 1 second. Suspected infinite loop.",SCHEDULER_CALLBACK_MUST_BE_FUNCTION:"Scheduler callback must be a function",SCHEDULER_END_BATCH_WITHOUT_START:"endBatch() called without matching startBatch(). Ignoring."};function D(i,t,e){if(i instanceof p)return i;const s=i instanceof Error,n=s?i.message:String(i),r=s?i:void 0,c=`${s?i.constructor.name:"Unexpected error"} (${e}): ${n}`;return new t(c,r)}class J{constructor(){this.flags=0,this.version=0,this._lastSeenEpoch=-1,this.id=ft()&P}}class Z extends J{subscribe(t){const e=typeof t=="function";if(!e&&(!t||typeof t.execute!="function"))throw D(new TypeError("Invalid subscriber"),p,u.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);const s=this._subscribers;for(let r=0,o=s.length;r<o;r++){const c=s[r];if(c&&(e?c.fn===t:c.sub===t))return()=>{}}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.slice(0),n=s.length;for(let r=0;r<n;r++){const o=s[r];if(o)try{o.fn?o.fn(t,e):o.sub&&o.sub.execute()}catch(c){this._handleNotifyError(c)}}}_handleNotifyError(t){console.error(D(t,p,u.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED))}}let B=0;const w=()=>(B=B+1&P||1,B),z=i=>i+1&P;let H=0,F=!1,tt=0;const Et=()=>tt;function et(){return F?!1:(F=!0,tt=w(),H=0,!0)}const st=()=>{F=!1},dt=()=>F?++H:0;class It{constructor(){this._queueBuffer=[[],[]],this._bufferIndex=0,this._size=0,this._epoch=0,this._isProcessing=!1,this._isBatching=!1,this._isFlushingSync=!1,this._batchDepth=0,this._batchQueue=[],this._batchQueueSize=0,this._maxFlushIterations=d.MAX_FLUSH_ITERATIONS,this.onOverflow=null,this._boundRunLoop=this._runLoop.bind(this)}get phase(){return this._isProcessing||this._isFlushingSync?2:this._isBatching?1:0}get queueSize(){return this._size}get isBatching(){return this._isBatching}schedule(t){if(t._nextEpoch!==this._epoch){if(t._nextEpoch=this._epoch,this._isBatching||this._isFlushingSync){this._batchQueue[this._batchQueueSize++]=t;return}this._queueBuffer[this._bufferIndex][this._size++]=t,this._isProcessing||this._flush()}}_flush(){this._isProcessing||this._size===0||(this._isProcessing=!0,queueMicrotask(this._boundRunLoop))}_runLoop(){try{if(this._size===0)return;const t=et();this._drainQueue(),t&&st()}finally{this._isProcessing=!1,this._size>0&&!this._isBatching&&this._flush()}}_flushSync(){this._isFlushingSync=!0;const t=et();try{this._mergeBatchQueue(),this._drainQueue()}finally{this._isFlushingSync=!1,t&&st()}}_mergeBatchQueue(){if(this._batchQueueSize===0)return;const t=++this._epoch,e=this._batchQueue,s=this._queueBuffer[this._bufferIndex];let n=this._size;for(let r=0;r<this._batchQueueSize;r++){const o=e[r];o._nextEpoch!==t&&(o._nextEpoch=t,s[n++]=o)}this._size=n,this._batchQueueSize=0,e.length>d.BATCH_QUEUE_SHRINK_THRESHOLD&&(e.length=0)}_drainQueue(){let t=0;for(;this._size>0;){if(++t>this._maxFlushIterations){this._handleFlushOverflow();return}this._processQueue(),this._mergeBatchQueue()}}_processQueue(){const t=this._bufferIndex,e=this._queueBuffer[t],s=this._size;this._bufferIndex=t^1,this._size=0,this._epoch++;for(let n=0;n<s;n++)try{e[n]()}catch(r){console.error(new R("Error occurred during scheduler execution",r))}e.length=0}_handleFlushOverflow(){const t=this._size+this._batchQueueSize;if(console.error(new R(u.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations,t))),this._size=0,this._queueBuffer[this._bufferIndex].length=0,this._batchQueueSize=0,this.onOverflow)try{this.onOverflow(t)}catch{}}startBatch(){this._batchDepth++,this._isBatching=!0}endBatch(){this._batchDepth!==0&&--this._batchDepth===0&&(this._flushSync(),this._isBatching=!1)}setMaxFlushIterations(t){if(t<d.MIN_FLUSH_ITERATIONS)throw new R(`Max flush iterations must be at least ${d.MIN_FLUSH_ITERATIONS}`);this._maxFlushIterations=t}}const T=new It,k=Symbol.for("atom-effect/atom"),V=Symbol.for("atom-effect/computed"),G=Symbol.for("atom-effect/effect"),a={current:null,run(i,t){const e=this.current;this.current=i;try{return t()}finally{this.current=e}}};function St(i){const t=a.current;if(t===null)return i();a.current=null;try{return i()}finally{a.current=t}}var it;class pt extends Z{constructor(t,e){super(),this._pendingOldValue=void 0,this._notifyTask=()=>this._flushNotifications(),this._subscribers=[],this[it]=!0,this._value=t,e&&(this.flags|=E.SYNC),A.attachDebugInfo(this,"atom",this.id)}get value(){const t=a.current;return t&&W(this,t,this._subscribers),this._value}set value(t){const e=this._value;if(Object.is(e,t))return;this._value=t,this.version=z(this.version);const s=this.flags;if(!(this._subscribers.length===0||s&E.NOTIFICATION_SCHEDULED)){if(this._pendingOldValue=e,this.flags=s|E.NOTIFICATION_SCHEDULED,s&E.SYNC&&!T.isBatching){this._flushNotifications();return}T.schedule(this._notifyTask)}}_flushNotifications(){const t=this.flags;if(!(t&E.NOTIFICATION_SCHEDULED)||t&E.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&E.DISPOSED||(this._subscribers.length=0,this.flags|=E.DISPOSED,this._value=void 0,this._pendingOldValue=void 0)}[(it=k,Symbol.dispose)](){this.dispose()}}function gt(i,t={}){return new pt(i,t.sync??!1)}class Ct{constructor(t=50,e=256,s=!1){this.limit=t,this.capacity=e,this.pool=[],this.stats=null,this.stats=s?{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 l=Object.freeze([]),S=new Ct;function Dt(i){return i!==null&&typeof i=="object"&&k in i}function Tt(i){return i!==null&&typeof i=="object"&&V in i}function Ot(i){return i!==null&&typeof i=="object"&&G in i}function nt(i){return i!==null&&typeof i=="object"&&typeof i.then=="function"}var rt,ot;const{IDLE:L,DIRTY:O,PENDING:m,RESOLVED:C,REJECTED:N,HAS_ERROR:U,RECOMPUTING:y,DISPOSED:X,IS_COMPUTED:bt}=j;function At(i){return i&C?f.RESOLVED:i&m?f.PENDING:i&N?f.REJECTED:f.IDLE}class Nt extends Z{constructor(t,e={}){if(typeof t!="function")throw new I(u.COMPUTED_MUST_BE_FUNCTION);super(),this[ot]=!0,this[rt]=!0,this._error=null,this._promiseId=0,this._subscribers=[],this._links=l,this._asyncStartAggregateVersion=0,this._asyncRetryCount=0,this._trackEpoch=-1,this._trackLinks=l,this._trackCount=0,this._value=void 0,this.flags=bt|O|L,this._equal=e.equal??Object.is,this._fn=t,this._defaultValue="defaultValue"in e?e.defaultValue:v,this._onError=e.onError??null;const s=e.maxAsyncRetries;if(this._maxAsyncRetries=s!=null&&s>=0?s:q.MAX_ASYNC_RETRIES,A.attachDebugInfo(this,"computed",this.id),e.lazy===!1)try{this._recompute()}catch{}}_track(){const t=a.current;t&&W(this,t,this._subscribers)}get value(){this._track();const t=this.flags;if((t&(C|O|L))===C)return this._value;if(t&X)throw new I(u.COMPUTED_DISPOSED);if(t&y){if(this._defaultValue!==v)return this._defaultValue;throw new I(u.COMPUTED_CIRCULAR_DEPENDENCY)}if(t&(O|L)&&(this._recompute(),this.flags&C))return this._value;const e=this._defaultValue,s=e!==v;if(this.flags&m){if(s)return e;throw new I(u.COMPUTED_ASYNC_PENDING_NO_DEFAULT)}if(this.flags&N){if(s)return e;throw this._error}return this._value}peek(){return this._value}get state(){return this._track(),At(this.flags)}get hasError(){if(this._track(),this.flags&(N|U))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&U)return!0}return!1}get isValid(){return!this.hasError}get errors(){if(this._track(),!this.hasError)return ut;const t=[];this._error&&t.push(this._error);const e=this._links;for(let s=0,n=e.length;s<n;s++){const r=e[s].node;if(r.flags&U){const c=r.errors;if(c.length>0)for(let b=0;b<c.length;b++){const Q=c[b];Q&&t.indexOf(Q)===-1&&t.push(Q)}}}return Object.freeze(t)}get lastError(){return this._track(),this._error}get isPending(){return this._track(),(this.flags&m)!==0}get isResolved(){return this._track(),(this.flags&C)!==0}invalidate(){this._markDirty()}dispose(){if(this.flags&X)return;const t=this._links;if(t!==l){for(let e=0,s=t.length;e<s;e++)t[e].unsub?.();S.release(t),this._links=l}this._subscribers.length=0,this.flags=X|O|L,this._error=null,this._value=void 0}[(ot=k,rt=V,Symbol.dispose)](){this.dispose()}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++}}_recompute(){if(this.flags&y)return;this.flags|=y;const t=this._links;this._trackEpoch=w(),this._trackLinks=S.acquire(),this._trackCount=0;let e=!1;try{const s=a.run(this,this._fn);this._trackLinks.length=this._trackCount,K(this._trackLinks,t,this),this._links=this._trackLinks,e=!0,nt(s)?this._handleAsyncComputation(s):this._finalizeResolution(s)}catch(s){if(!e)try{this._trackLinks.length=this._trackCount,K(this._trackLinks,t,this),this._links=this._trackLinks,e=!0}catch{}this._handleError(s,u.COMPUTED_COMPUTATION_FAILED,!0)}finally{e&&t!==l?S.release(t):e||S.release(this._trackLinks),this._trackEpoch=-1,this._trackLinks=l,this._trackCount=0,this.flags&=~y}}_handleAsyncComputation(t){this.flags=(this.flags|m)&-217,this._notifySubscribers(void 0,void 0),this._asyncStartAggregateVersion=this._captureVersionSnapshot(),this._asyncRetryCount=0,this._promiseId=(this._promiseId+1)%q.MAX_PROMISE_ID;const e=this._promiseId;t.then(s=>{if(e===this._promiseId){if(this._captureVersionSnapshot()!==this._asyncStartAggregateVersion)return this._asyncRetryCount++<this._maxAsyncRetries?this._markDirty():this._handleError(new I(`Async drift threshold exceeded after ${this._maxAsyncRetries} retries.`),u.COMPUTED_ASYNC_COMPUTATION_FAILED);this._finalizeResolution(s),this._notifySubscribers(s,void 0)}},s=>e===this._promiseId&&this._handleError(s,u.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+e[s].node.version|0;return t}_handleError(t,e,s=!1){const n=D(t,I,e);if(!s&&!(this.flags&N)&&(this.version=z(this.version)),this._error=n,this.flags=this.flags&-121|N|U,this._onError)try{this._onError(n)}catch(r){console.error(u.CALLBACK_ERROR_IN_ERROR_HANDLER,r)}if(s)throw n;this._notifySubscribers(void 0,void 0)}_finalizeResolution(t){(!(this.flags&C)||!this._equal(this._value,t))&&(this.version=z(this.version)),this._value=t,this._error=null,this.flags=(this.flags|C)&-697}execute(){this._markDirty()}_markDirty(){this.flags&(y|O)||(this.flags|=O,this._notifySubscribers(void 0,void 0))}}function yt(i,t={}){return new Nt(i,t)}var ht;class Rt extends J{constructor(t,e={}){super(),this[ht]=!0,this._cleanup=null,this._links=l,this._nextLinks=null,this._prevLinks=l,this._currentEpoch=-1,this._lastFlushEpoch=-1,this._executionsInEpoch=0,this._executionCount=0,this._windowStart=0,this._windowCount=0,this._execId=0,this._fn=t,this._onError=e.onError??null,this._sync=e.sync??!1,this._maxExecutions=e.maxExecutionsPerSecond??d.MAX_EXECUTIONS_PER_SECOND,this._maxExecutionsPerFlush=e.maxExecutionsPerFlush??d.MAX_EXECUTIONS_PER_EFFECT,this._sync?(this._executeTask=void 0,this._notifyCallback=()=>this.execute()):(this._executeTask=()=>this.execute(),this._notifyCallback=()=>T.schedule(this._executeTask)),A.attachDebugInfo(this,"effect",this.id)}run(){if(this.flags&_.DISPOSED)throw new g(u.EFFECT_DISPOSED);this.execute(!0)}dispose(){this.flags&_.DISPOSED||(this.flags|=_.DISPOSED,this._execCleanup(),this._unsubLinks(this._links),this._links!==l&&S.release(this._links),this._links=l,this._prevLinks=l)}[(ht=G,Symbol.dispose)](){this.dispose()}addDependency(t){if(!(this.flags&_.EXECUTING))return;const e=this._currentEpoch;if(t._lastSeenEpoch===e)return;t._lastSeenEpoch=e;const s=this._nextLinks,n=this._prevLinks;for(let r=0,o=n.length;r<o;r++){const c=n[r];if(c&&c.node===t&&c.unsub){c.version=t.version,s.push(c),n[r]=null;return}}try{const r=t.subscribe(this._notifyCallback);s.push(new x(t,t.version,r))}catch(r){const o=D(r,g,u.EFFECT_EXECUTION_FAILED);if(console.error(o),this._onError)try{this._onError(o)}catch{}s.push(new x(t,t.version,void 0))}}execute(t=!1){if(this.flags&(_.DISPOSED|_.EXECUTING)||!t&&this._links.length>0&&!this._isDirty())return;this._checkInfiniteLoops(),this.flags|=_.EXECUTING,this._execCleanup(),this._prevLinks=this._links;const e=S.acquire();this._nextLinks=e,this._currentEpoch=w();let s=!1;try{const n=a.run(this,this._fn);this._links=e,s=!0,nt(n)?this._handleAsyncResult(n):this._cleanup=typeof n=="function"?n:null}catch(n){this._links=e,s=!0,this._handleExecutionError(n),this._cleanup=null}finally{this._finalizeDependencies(s,this._prevLinks,e),this.flags&=-9}}_handleAsyncResult(t){const e=++this._execId;t.then(s=>{if(e!==this._execId||this.flags&_.DISPOSED){if(typeof s=="function")try{s()}catch(n){this._handleExecutionError(n,u.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,this._prevLinks=l,t){for(let n=0,r=e.length;n<r;n++){const o=e[n];o&&o.unsub?.()}e!==l&&S.release(e)}else this._unsubLinks(s),S.release(s)}_unsubLinks(t){for(let e=0,s=t.length;e<s;e++)t[e]?.unsub?.()}_isDirty(){const t=this._links,e=a.current;a.current=null;try{for(let s=0,n=t.length;s<n;s++){const r=t[s],o=r.node;if(o.flags&j.IS_COMPUTED)try{o.value}catch{return!0}if(o.version!==r.version)return!0}return!1}finally{a.current=e}}_execCleanup(){if(this._cleanup){try{this._cleanup()}catch(t){this._handleExecutionError(t,u.EFFECT_CLEANUP_FAILED)}this._cleanup=null}}_checkInfiniteLoops(){const t=Et();this._lastFlushEpoch!==t&&(this._lastFlushEpoch=t,this._executionsInEpoch=0),++this._executionsInEpoch>this._maxExecutionsPerFlush&&this._throwInfiniteLoopError("per-effect"),dt()>d.MAX_EXECUTIONS_PER_FLUSH&&this._throwInfiniteLoopError("global"),this._executionCount++}get isDisposed(){return(this.flags&_.DISPOSED)!==0}get executionCount(){return this._executionCount}get isExecuting(){return(this.flags&_.EXECUTING)!==0}_throwInfiniteLoopError(t){const e=new g(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${H}`);throw this.dispose(),console.error(e),e}_handleExecutionError(t,e=u.EFFECT_EXECUTION_FAILED){const s=D(t,g,e);if(console.error(s),this._onError)try{this._onError(s)}catch(n){console.error(D(n,g,u.CALLBACK_ERROR_IN_ERROR_HANDLER))}}}function Ft(i,t={}){if(typeof i!="function")throw new g(u.EFFECT_MUST_BE_FUNCTION);const e=new Rt(i,t);return e.execute(),e}function kt(i){if(typeof i!="function")throw new TypeError("Batch callback must be a function");T.startBatch();try{return i()}finally{T.endBatch()}}h.ATOM_BRAND=k,h.AsyncState=f,h.AtomError=p,h.COMPUTED_BRAND=V,h.ComputedError=I,h.DEBUG_CONFIG=Y,h.DEBUG_RUNTIME=A,h.EFFECT_BRAND=G,h.EffectError=g,h.POOL_CONFIG=ct,h.SCHEDULER_CONFIG=d,h.SchedulerError=R,h.atom=gt,h.batch=kt,h.computed=yt,h.effect=Ft,h.isAtom=Dt,h.isComputed=Tt,h.isEffect=Ot,h.scheduler=T,h.untracked=St,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(o,l){typeof exports=="object"&&typeof module<"u"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(o=typeof globalThis<"u"?globalThis:o||self,l(o.AtomEffect={}))})(this,(function(o){"use strict";const l={IDLE:"idle",PENDING:"pending",RESOLVED:"resolved",REJECTED:"rejected"},_={DISPOSED:1,EXECUTING:8},X={DISPOSED:1,IS_COMPUTED:2,DIRTY:8,IDLE:16,PENDING:32,RESOLVED:64,REJECTED:128,RECOMPUTING:256,HAS_ERROR:512},f={DISPOSED:1,SYNC:8,NOTIFICATION_SCHEDULED:16},ot={MAX_SIZE:1e3,WARMUP_SIZE:100,ENABLE_STATS:!1},E={MAX_EXECUTIONS_PER_SECOND:1e3,MAX_EXECUTIONS_PER_EFFECT:100,MAX_EXECUTIONS_PER_FLUSH:1e4,MAX_FLUSH_ITERATIONS:1e3,MIN_FLUSH_ITERATIONS:10,BATCH_QUEUE_SHRINK_THRESHOLD:1e3},Q={WARN_INFINITE_LOOP:!0,EFFECT_FREQUENCY_WINDOW:1e3},Y={MAX_ASYNC_RETRIES:3,MAX_PROMISE_ID:Number.MAX_SAFE_INTEGER-1},N=1073741823,q=typeof process<"u"&&process.env&&!1||!1,ht=Object.freeze([]);class p extends Error{constructor(t,e=null,s=!0){super(t),this.cause=e,this.recoverable=s,this.name="AtomError"}}class d extends p{constructor(t,e=null){super(t,e,!0),this.name="ComputedError"}}class S extends p{constructor(t,e=null){super(t,e,!1),this.name="EffectError"}}class y extends p{constructor(t,e=null){super(t,e,!1),this.name="SchedulerError"}}const ct=Symbol("AtomEffect.DebugName"),ut=Symbol("AtomEffect.Type"),P=Symbol("AtomEffect.NoDefaultValue"),O={enabled:q,warnInfiniteLoop:Q.WARN_INFINITE_LOOP,warn(i,t){},checkCircular(i,t){if(i===t)throw new d("Direct circular dependency detected")},attachDebugInfo(i,t,e){},getDebugName:i=>i?.[ct],getDebugType:i=>i?.[ut]};let _t=1;const at=()=>_t++;function j(i,t,e){if(typeof t=="function"){const n=t;if(e.some(r=>r&&r.fn===n))return;e.push(new x(n,void 0));return}if("addDependency"in t){t.addDependency(i);return}const s=t;e.some(n=>n&&n.sub===s)||e.push(new x(void 0,s))}function $(i,t,e){const s=new Map;t.forEach(n=>{n?.unsub&&s.set(n.node,n.unsub)}),i.forEach(n=>{if(!n)return;const r=n.node,c=s.get(r);c!==void 0?(n.unsub=c,s.delete(r)):(O.checkCircular(r,e),n.unsub=r.subscribe(e))}),s.forEach(n=>n())}class v{constructor(t,e,s=void 0){this.node=t,this.version=e,this.unsub=s}}class x{constructor(t,e){this.fn=t,this.sub=e}}const h={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",SCHEDULER_FLUSH_OVERFLOW:(i,t)=>`Maximum flush iterations (${i}) exceeded. ${t} jobs dropped. Possible infinite loop.`,CALLBACK_ERROR_IN_ERROR_HANDLER:"Exception encountered in onError handler",EFFECT_FREQUENCY_LIMIT_EXCEEDED:"Effect executed too frequently within 1 second. Suspected infinite loop.",SCHEDULER_CALLBACK_MUST_BE_FUNCTION:"Scheduler callback must be a function",SCHEDULER_END_BATCH_WITHOUT_START:"endBatch() called without matching startBatch(). Ignoring."};function D(i,t,e){if(i instanceof p)return i;const s=i instanceof Error,n=s?i.message:String(i),r=s?i:void 0,k=`${s?i.constructor.name:"Unexpected error"} (${e}): ${n}`;return new t(k,r)}class W{constructor(){this.flags=0,this.version=0,this._lastSeenEpoch=-1,this.id=at()&N}}class K extends W{subscribe(t){const e=typeof t=="function";if(!e&&(!t||typeof t.execute!="function"))throw D(new TypeError("Invalid subscriber"),p,h.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);if(this._subscribers.some(r=>r?e?r.fn===t:r.sub===t:!1))return()=>{};const s=new x(e?t:void 0,e?void 0:t);return this._subscribers.push(s),()=>this._unsubscribe(s)}_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;this._subscribers.slice(0).forEach(n=>{if(n)try{n.fn?n.fn(t,e):n.sub&&n.sub.execute()}catch(r){this._handleNotifyError(r)}})}_handleNotifyError(t){console.error(D(t,p,h.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED))}}let M=0;const B=()=>(M=M+1&N||1,M),w=i=>i+1&N;let z=0,R=!1,J=0;const lt=()=>J;function Z(){return R?!1:(R=!0,J=B(),z=0,!0)}const tt=()=>{R=!1},ft=()=>R?++z:0;class Et{constructor(){this._queueBuffer=[[],[]],this._bufferIndex=0,this._size=0,this._epoch=0,this._isProcessing=!1,this._isBatching=!1,this._isFlushingSync=!1,this._batchDepth=0,this._batchQueue=[],this._batchQueueSize=0,this._maxFlushIterations=E.MAX_FLUSH_ITERATIONS,this.onOverflow=null,this._boundRunLoop=this._runLoop.bind(this)}get phase(){return this._isProcessing||this._isFlushingSync?2:this._isBatching?1:0}get queueSize(){return this._size}get isBatching(){return this._isBatching}schedule(t){if(t._nextEpoch!==this._epoch){if(t._nextEpoch=this._epoch,this._isBatching||this._isFlushingSync){this._batchQueue[this._batchQueueSize++]=t;return}this._queueBuffer[this._bufferIndex][this._size++]=t,this._isProcessing||this._flush()}}_flush(){this._isProcessing||this._size===0||(this._isProcessing=!0,queueMicrotask(this._boundRunLoop))}_runLoop(){try{if(this._size===0)return;const t=Z();this._drainQueue(),t&&tt()}finally{this._isProcessing=!1,this._size>0&&!this._isBatching&&this._flush()}}_flushSync(){this._isFlushingSync=!0;const t=Z();try{this._mergeBatchQueue(),this._drainQueue()}finally{this._isFlushingSync=!1,t&&tt()}}_mergeBatchQueue(){if(this._batchQueueSize===0)return;const t=++this._epoch,e=this._batchQueue,s=this._queueBuffer[this._bufferIndex];let n=this._size;e.slice(0,this._batchQueueSize).forEach(r=>{r._nextEpoch!==t&&(r._nextEpoch=t,s[n++]=r)}),this._size=n,this._batchQueueSize=0,e.length>E.BATCH_QUEUE_SHRINK_THRESHOLD&&(e.length=0)}_drainQueue(){let t=0;for(;this._size>0;){if(++t>this._maxFlushIterations){this._handleFlushOverflow();return}this._processQueue(),this._mergeBatchQueue()}}_processQueue(){const t=this._bufferIndex,e=this._queueBuffer[t],s=this._size;this._bufferIndex=t^1,this._size=0,this._epoch++;for(let n=0;n<s;n++)try{e[n]()}catch(r){console.error(new y("Error occurred during scheduler execution",r))}e.length=0}_handleFlushOverflow(){const t=this._size+this._batchQueueSize;if(console.error(new y(h.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations,t))),this._size=0,this._queueBuffer[this._bufferIndex].length=0,this._batchQueueSize=0,this.onOverflow)try{this.onOverflow(t)}catch{}}startBatch(){this._batchDepth++,this._isBatching=!0}endBatch(){this._batchDepth!==0&&--this._batchDepth===0&&(this._flushSync(),this._isBatching=!1)}setMaxFlushIterations(t){if(t<E.MIN_FLUSH_ITERATIONS)throw new y(`Max flush iterations must be at least ${E.MIN_FLUSH_ITERATIONS}`);this._maxFlushIterations=t}}const g=new Et,m=Symbol.for("atom-effect/atom"),H=Symbol.for("atom-effect/computed"),V=Symbol.for("atom-effect/effect"),a={current:null,run(i,t){const e=this.current;this.current=i;try{return t()}finally{this.current=e}}};function dt(i){const t=a.current;if(t===null)return i();a.current=null;try{return i()}finally{a.current=t}}var et;class It extends K{constructor(t,e){super(),this._pendingOldValue=void 0,this._notifyTask=()=>this._flushNotifications(),this._subscribers=[],this[et]=!0,this._value=t,e&&(this.flags|=f.SYNC),O.attachDebugInfo(this,"atom",this.id)}get value(){const t=a.current;return t&&j(this,t,this._subscribers),this._value}set value(t){const e=this._value;if(Object.is(e,t))return;this._value=t,this.version=w(this.version);const s=this.flags;if(!(this._subscribers.length===0||s&f.NOTIFICATION_SCHEDULED)){if(this._pendingOldValue=e,this.flags=s|f.NOTIFICATION_SCHEDULED,s&f.SYNC&&!g.isBatching){this._flushNotifications();return}g.schedule(this._notifyTask)}}_flushNotifications(){const t=this.flags;if(!(t&f.NOTIFICATION_SCHEDULED)||t&f.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&f.DISPOSED||(this._subscribers.length=0,this.flags|=f.DISPOSED,this._value=void 0,this._pendingOldValue=void 0)}[(et=m,Symbol.dispose)](){this.dispose()}}function pt(i,t={}){return new It(i,t.sync??!1)}class St{constructor(t=50,e=256,s=!1){this.limit=t,this.capacity=e,this.pool=[],this.stats=null,this.stats=s?{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 u=Object.freeze([]),I=new St;function Ct(i){return i!==null&&typeof i=="object"&&m in i}function Dt(i){return i!==null&&typeof i=="object"&&H in i}function gt(i){return i!==null&&typeof i=="object"&&V in i}function st(i){return i!==null&&typeof i=="object"&&typeof i.then=="function"}var it,nt;const{IDLE:L,DIRTY:T,PENDING:F,RESOLVED:C,REJECTED:b,HAS_ERROR:U,RECOMPUTING:A,DISPOSED:G,IS_COMPUTED:Tt}=X;function Ot(i){return i&C?l.RESOLVED:i&F?l.PENDING:i&b?l.REJECTED:l.IDLE}class bt extends K{constructor(t,e={}){if(typeof t!="function")throw new d(h.COMPUTED_MUST_BE_FUNCTION);super(),this[nt]=!0,this[it]=!0,this._error=null,this._promiseId=0,this._subscribers=[],this._links=u,this._asyncStartAggregateVersion=0,this._asyncRetryCount=0,this._trackEpoch=-1,this._trackLinks=u,this._trackCount=0,this._value=void 0,this.flags=Tt|T|L,this._equal=e.equal??Object.is,this._fn=t,this._defaultValue="defaultValue"in e?e.defaultValue:P,this._onError=e.onError??null;const s=e.maxAsyncRetries;if(this._maxAsyncRetries=(s??Y.MAX_ASYNC_RETRIES)&N,O.attachDebugInfo(this,"computed",this.id),e.lazy===!1)try{this._recompute()}catch{}}_track(){const t=a.current;t&&j(this,t,this._subscribers)}get value(){this._track();const t=this.flags;if((t&(C|T|L))===C)return this._value;if(t&G)throw new d(h.COMPUTED_DISPOSED);if(t&A){if(this._defaultValue!==P)return this._defaultValue;throw new d(h.COMPUTED_CIRCULAR_DEPENDENCY)}if(t&(T|L)&&(this._recompute(),this.flags&C))return this._value;const e=this._defaultValue,s=e!==P;if(this.flags&F){if(s)return e;throw new d(h.COMPUTED_ASYNC_PENDING_NO_DEFAULT)}if(this.flags&b){if(s)return e;throw this._error}return this._value}peek(){return this._value}get state(){return this._track(),Ot(this.flags)}get hasError(){return this._track(),this.flags&(b|U)?!0:this._links.some(t=>t?.node?.flags&U)}get isValid(){return!this.hasError}get errors(){if(this._track(),!this.hasError)return ht;const t=[];return this._error&&t.push(this._error),this._links.forEach(s=>{const n=s.node;n.flags&U&&n.errors.forEach(c=>{c&&!t.includes(c)&&t.push(c)})}),Object.freeze(t)}get lastError(){return this._track(),this._error}get isPending(){return this._track(),(this.flags&F)!==0}get isResolved(){return this._track(),(this.flags&C)!==0}invalidate(){this._markDirty()}dispose(){if(this.flags&G)return;const t=this._links;t!==u&&(t.forEach(e=>e.unsub?.()),I.release(t),this._links=u),this._subscribers.length=0,this.flags=G|T|L,this._error=null,this._value=void 0}[(nt=m,it=H,Symbol.dispose)](){this.dispose()}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 v(t,t.version));this._trackCount++}}_recompute(){if(this.flags&A)return;this.flags|=A;const t=this._links;this._trackEpoch=B(),this._trackLinks=I.acquire(),this._trackCount=0;let e=!1;try{const s=a.run(this,this._fn);this._trackLinks.length=this._trackCount,$(this._trackLinks,t,this),this._links=this._trackLinks,e=!0,st(s)?this._handleAsyncComputation(s):this._finalizeResolution(s)}catch(s){if(!e)try{this._trackLinks.length=this._trackCount,$(this._trackLinks,t,this),this._links=this._trackLinks,e=!0}catch{}this._handleError(s,h.COMPUTED_COMPUTATION_FAILED,!0)}finally{e&&t!==u?I.release(t):e||I.release(this._trackLinks),this._trackEpoch=-1,this._trackLinks=u,this._trackCount=0,this.flags&=~A}}_handleAsyncComputation(t){this.flags=(this.flags|F)&-217,this._notifySubscribers(void 0,void 0),this._asyncStartAggregateVersion=this._captureVersionSnapshot(),this._asyncRetryCount=0,this._promiseId=(this._promiseId+1)%Y.MAX_PROMISE_ID;const e=this._promiseId;t.then(s=>{if(e===this._promiseId){if(this._captureVersionSnapshot()!==this._asyncStartAggregateVersion)return this._asyncRetryCount++<this._maxAsyncRetries?this._markDirty():this._handleError(new d(`Async drift threshold exceeded after ${this._maxAsyncRetries} retries.`),h.COMPUTED_ASYNC_COMPUTATION_FAILED);this._finalizeResolution(s),this._notifySubscribers(s,void 0)}},s=>e===this._promiseId&&this._handleError(s,h.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+e[s].node.version|0;return t}_handleError(t,e,s=!1){const n=D(t,d,e);if(!s&&!(this.flags&b)&&(this.version=w(this.version)),this._error=n,this.flags=this.flags&-121|b|U,this._onError)try{this._onError(n)}catch(r){console.error(h.CALLBACK_ERROR_IN_ERROR_HANDLER,r)}if(s)throw n;this._notifySubscribers(void 0,void 0)}_finalizeResolution(t){(!(this.flags&C)||!this._equal(this._value,t))&&(this.version=w(this.version)),this._value=t,this._error=null,this.flags=(this.flags|C)&-697}execute(){this._markDirty()}_markDirty(){this.flags&(A|T)||(this.flags|=T,this._notifySubscribers(void 0,void 0))}}function At(i,t={}){return new bt(i,t)}var rt;class Nt extends W{constructor(t,e={}){super(),this[rt]=!0,this._cleanup=null,this._links=u,this._nextLinks=null,this._prevLinks=u,this._currentEpoch=-1,this._lastFlushEpoch=-1,this._executionsInEpoch=0,this._executionCount=0,this._windowStart=0,this._windowCount=0,this._execId=0,this._fn=t,this._onError=e.onError??null,this._sync=e.sync??!1,this._maxExecutions=e.maxExecutionsPerSecond??E.MAX_EXECUTIONS_PER_SECOND,this._maxExecutionsPerFlush=e.maxExecutionsPerFlush??E.MAX_EXECUTIONS_PER_EFFECT,this._sync?(this._executeTask=void 0,this._notifyCallback=()=>this.execute()):(this._executeTask=()=>this.execute(),this._notifyCallback=()=>g.schedule(this._executeTask)),O.attachDebugInfo(this,"effect",this.id)}run(){if(this.flags&_.DISPOSED)throw new S(h.EFFECT_DISPOSED);this.execute(!0)}dispose(){this.flags&_.DISPOSED||(this.flags|=_.DISPOSED,this._execCleanup(),this._unsubLinks(this._links),this._links!==u&&I.release(this._links),this._links=u,this._prevLinks=u)}[(rt=V,Symbol.dispose)](){this.dispose()}addDependency(t){if(!(this.flags&_.EXECUTING))return;const e=this._currentEpoch;if(t._lastSeenEpoch===e)return;t._lastSeenEpoch=e;const s=this._nextLinks,n=this._prevLinks,r=n.findIndex(c=>c&&c.node===t&&c.unsub);if(r!==-1){const c=n[r];c.version=t.version,s.push(c),n[r]=null;return}try{const c=t.subscribe(this._notifyCallback);s.push(new v(t,t.version,c))}catch(c){const k=D(c,S,h.EFFECT_EXECUTION_FAILED);if(console.error(k),this._onError)try{this._onError(k)}catch{}s.push(new v(t,t.version,void 0))}}execute(t=!1){if(this.flags&(_.DISPOSED|_.EXECUTING)||!t&&this._links.length>0&&!this._isDirty())return;this._checkInfiniteLoops(),this.flags|=_.EXECUTING,this._execCleanup(),this._prevLinks=this._links;const e=I.acquire();this._nextLinks=e,this._currentEpoch=B();let s=!1;try{const n=a.run(this,this._fn);this._links=e,s=!0,st(n)?this._handleAsyncResult(n):this._cleanup=typeof n=="function"?n:null}catch(n){this._links=e,s=!0,this._handleExecutionError(n),this._cleanup=null}finally{this._finalizeDependencies(s,this._prevLinks,e),this.flags&=-9}}_handleAsyncResult(t){const e=++this._execId;t.then(s=>{if(e!==this._execId||this.flags&_.DISPOSED){if(typeof s=="function")try{s()}catch(n){this._handleExecutionError(n,h.EFFECT_CLEANUP_FAILED)}return}typeof s=="function"&&(this._cleanup=s)},s=>e===this._execId&&this._handleExecutionError(s))}_finalizeDependencies(t,e,s){this._nextLinks=null,this._prevLinks=u,t?(e.forEach(n=>n?.unsub?.()),e!==u&&I.release(e)):(this._unsubLinks(s),I.release(s))}_unsubLinks(t){t.forEach(e=>e?.unsub?.())}_isDirty(){const t=this._links,e=a.current;a.current=null;try{return t.some(s=>{const n=s.node;if(n.flags&X.IS_COMPUTED)try{n.value}catch{return!0}return n.version!==s.version})}finally{a.current=e}}_execCleanup(){if(this._cleanup){try{this._cleanup()}catch(t){this._handleExecutionError(t,h.EFFECT_CLEANUP_FAILED)}this._cleanup=null}}_checkInfiniteLoops(){const t=lt();this._lastFlushEpoch!==t&&(this._lastFlushEpoch=t,this._executionsInEpoch=0),++this._executionsInEpoch>this._maxExecutionsPerFlush&&this._throwInfiniteLoopError("per-effect"),ft()>E.MAX_EXECUTIONS_PER_FLUSH&&this._throwInfiniteLoopError("global"),this._executionCount++}get isDisposed(){return(this.flags&_.DISPOSED)!==0}get executionCount(){return this._executionCount}get isExecuting(){return(this.flags&_.EXECUTING)!==0}_throwInfiniteLoopError(t){const e=new S(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${z}`);throw this.dispose(),console.error(e),e}_handleExecutionError(t,e=h.EFFECT_EXECUTION_FAILED){const s=D(t,S,e);if(console.error(s),this._onError)try{this._onError(s)}catch(n){console.error(D(n,S,h.CALLBACK_ERROR_IN_ERROR_HANDLER))}}}function yt(i,t={}){if(typeof i!="function")throw new S(h.EFFECT_MUST_BE_FUNCTION);const e=new Nt(i,t);return e.execute(),e}function Rt(i){if(typeof i!="function")throw new TypeError("Batch callback must be a function");g.startBatch();try{return i()}finally{g.endBatch()}}o.ATOM_BRAND=m,o.AsyncState=l,o.AtomError=p,o.COMPUTED_BRAND=H,o.ComputedError=d,o.DEBUG_CONFIG=Q,o.DEBUG_RUNTIME=O,o.EFFECT_BRAND=V,o.EffectError=S,o.POOL_CONFIG=ot,o.SCHEDULER_CONFIG=E,o.SchedulerError=y,o.atom=pt,o.batch=Rt,o.computed=At,o.effect=yt,o.isAtom=Ct,o.isComputed=Dt,o.isEffect=gt,o.scheduler=g,o.untracked=dt,Object.defineProperty(o,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/symbols.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 * 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 * Effect flags.\n */\nexport const EFFECT_STATE_FLAGS = {\n DISPOSED: 1 << 0,\n EXECUTING: 1 << 3,\n} as const;\n\n/**\n * Computed flags.\n */\nexport const COMPUTED_STATE_FLAGS = {\n DISPOSED: 1 << 0,\n /** Marker bit: identifies this node as a computed. */\n IS_COMPUTED: 1 << 1,\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 DISPOSED: 1 << 0,\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 ENABLE_STATS: false,\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 BATCH_QUEUE_SHRINK_THRESHOLD: 1000,\n} as const;\n\n/**\n * Debugging thresholds.\n */\nexport const DEBUG_CONFIG = {\n WARN_INFINITE_LOOP: true,\n EFFECT_FREQUENCY_WINDOW: 1000,\n} as const;\n\n/**\n * Computed configuration.\n */\nexport const COMPUTED_CONFIG = {\n MAX_ASYNC_RETRIES: 3,\n MAX_PROMISE_ID: Number.MAX_SAFE_INTEGER - 1,\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 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 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 = (): DependencyId => nextId++;\n","import 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: Subscription<T>[]\n): void {\n if (typeof current === 'function') {\n const fn = current as (newValue?: T, oldValue?: T) => void;\n // O(n) duplicate check — acceptable because:\n // 1. subscribers array is typically 1-10 elements\n // 2. DependencySubscriber (hot path) uses O(1) epoch-based dedup via addDependency\n // 3. This branch only runs for raw function listeners (uncommon)\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 Subscription(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 Subscription(undefined, sub));\n}\n\n/**\n * Syncs dependencies.\n * Uses a local Map to park previous subscriptions, avoiding\n * temporary state on dependency nodes.\n */\nexport function syncDependencies(\n nextLinks: DependencyLink[],\n prevLinks: DependencyLink[],\n tracker: Subscriber\n): void {\n // Park: collect previous subscriptions into a local Map\n const parked = new Map<Dependency, () => void>();\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n const link = prevLinks[i];\n if (link?.unsub) {\n parked.set(link.node, link.unsub);\n }\n }\n\n // Reclaim or subscribe\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 const existing = parked.get(node);\n if (existing !== undefined) {\n // Re-link: reclaim subscription from previous set\n link.unsub = existing;\n parked.delete(node);\n } else {\n // New link: subscribe afresh\n debug.checkCircular(node, tracker);\n link.unsub = node.subscribe(tracker);\n }\n }\n\n // Cleanup: release unused subscriptions\n for (const unsub of parked.values()) {\n unsub();\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 * Subscription entry.\n */\nexport class Subscription<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 // Scheduler Errors\n SCHEDULER_FLUSH_OVERFLOW: (max: number, dropped: number): string =>\n `Maximum flush iterations (${max}) exceeded. ${dropped} jobs dropped. Possible infinite loop.`,\n\n // System / Debug\n CALLBACK_ERROR_IN_ERROR_HANDLER: 'Exception encountered in onError handler',\n\n // Effect frequency\n EFFECT_FREQUENCY_LIMIT_EXCEEDED:\n 'Effect executed too frequently within 1 second. Suspected infinite loop.',\n\n SCHEDULER_CALLBACK_MUST_BE_FUNCTION: 'Scheduler callback must be a function',\n SCHEDULER_END_BATCH_WITHOUT_START: 'endBatch() called without matching startBatch(). Ignoring.',\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 const type = isNativeError ? error.constructor.name : 'Unexpected error';\n const finalMessage = `${type} (${context}): ${originalMessage}`;\n\n return new ErrorClass(finalMessage, cause);\n}\n","import { IS_DEV, SMI_MAX } from '@/constants';\nimport { Subscription } 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 /** Debug ID */\n readonly id: DependencyId = generateId() & SMI_MAX;\n}\n\n/**\n * Reactive dependency base class.\n */\nexport abstract class ReactiveDependency<T> extends ReactiveNode {\n protected abstract _subscribers: Subscription<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 Subscription<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: Subscription<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.slice(0);\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\n/** Increments a version counter within SMI range. */\nexport const nextVersion = (v: number) => (v + 1) & SMI_MAX;\n\nexport let flushExecutionCount = 0;\nlet isFlushing = false;\nlet _flushEpoch = 0;\n\n/** Current flush epoch. */\nexport const currentFlushEpoch = () => _flushEpoch;\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 = nextEpoch();\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 { ERROR_MESSAGES } from '@/errors/messages';\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 */\nclass Scheduler {\n /** Queue buffer */\n _queueBuffer: [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: SchedulerJob[] = [];\n _batchQueueSize = 0;\n\n /** Config */\n _maxFlushIterations: number = SCHEDULER_CONFIG.MAX_FLUSH_ITERATIONS;\n\n /** Overflow callback */\n onOverflow: ((droppedCount: number) => void) | null = null;\n\n /** Bound run loop for microtask */\n private readonly _boundRunLoop = this._runLoop.bind(this);\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(ERROR_MESSAGES.SCHEDULER_CALLBACK_MUST_BE_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._boundRunLoop);\n }\n\n /**\n * Scheduler loop.\n */\n private _runLoop(): void {\n try {\n if (this._size === 0) return;\n\n const started = startFlush();\n this._drainQueue();\n if (started) endFlush();\n } finally {\n this._isProcessing = false;\n // If new jobs arrived during flush (and not batching), re-schedule\n if (this._size > 0 && !this._isBatching) {\n this._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 private _handleFlushOverflow(): void {\n const droppedCount = this._size + this._batchQueueSize;\n console.error(\n new SchedulerError(\n ERROR_MESSAGES.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations, droppedCount)\n )\n );\n this._size = 0;\n this._queueBuffer[this._bufferIndex]!.length = 0;\n this._batchQueueSize = 0;\n\n if (this.onOverflow) {\n try {\n this.onOverflow(droppedCount);\n } catch {}\n }\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(ERROR_MESSAGES.SCHEDULER_END_BATCH_WITHOUT_START);\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\nexport const scheduler = new Scheduler();\n","/**\n * Brand symbols for reliable type identification.\n * Prevents false positives from duck-typing with external objects.\n */\nexport const ATOM_BRAND: unique symbol = Symbol.for('atom-effect/atom');\nexport const COMPUTED_BRAND: unique symbol = Symbol.for('atom-effect/computed');\nexport const EFFECT_BRAND: unique symbol = Symbol.for('atom-effect/effect');\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 } from '@/constants';\nimport { ReactiveDependency } from '@/core/base';\nimport { type Subscription, trackDependency } from '@/core/dep-tracking';\nimport { nextVersion } from '@/internal/epoch';\nimport { scheduler } from '@/internal/scheduler';\nimport { ATOM_BRAND } from '@/symbols';\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 readonly _notifyTask = () => this._flushNotifications();\n protected _subscribers: Subscription<T>[] = [];\n\n /** @internal */\n readonly [ATOM_BRAND] = true;\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 = nextVersion(this.version);\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 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 }\n\n [Symbol.dispose](): void {\n this.dispose();\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 when disabled\n private stats: {\n acquired: number;\n released: number;\n rejected: { frozen: number; tooLarge: number; poolFull: number };\n } | null = 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 * @param enableStats - Force-enable stats even in production (default: false).\n */\n constructor(\n private readonly limit = 50,\n private readonly capacity = 256,\n enableStats = false\n ) {\n this.stats =\n IS_DEV || enableStats\n ? {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 },\n }\n : null;\n }\n\n /**\n * Acquires array.\n */\n acquire(): T[] {\n if (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 (this.stats) this.stats.rejected.tooLarge++;\n return;\n }\n\n if (this.pool.length >= this.limit) {\n if (this.stats) this.stats.rejected.poolFull++;\n return;\n }\n\n if (Object.isFrozen(arr)) {\n if (this.stats) this.stats.rejected.frozen++;\n return;\n }\n\n arr.length = 0;\n this.pool.push(arr);\n\n if (this.stats) {\n this.stats.released++;\n }\n }\n\n /**\n * Pool stats.\n */\n getStats(): PoolStats | null {\n if (!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 (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 { ArrayPool } from '@/utils/array-pool';\n\nexport const EMPTY_LINKS: DependencyLink[] = Object.freeze(\n [] as unknown as DependencyLink[]\n) as DependencyLink[];\n\nexport const linksArrayPool = new ArrayPool<DependencyLink>();\n","import { ATOM_BRAND, COMPUTED_BRAND, EFFECT_BRAND } from '@/symbols';\nimport 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 obj !== null && typeof obj === 'object' && ATOM_BRAND in obj;\n}\n\n/**\n * Writable atom check.\n */\nexport function isWritable(obj: unknown): obj is WritableAtom {\n return isAtom(obj) && !isComputed(obj);\n}\n\n/**\n * Computed atom check.\n */\nexport function isComputed(obj: unknown): obj is ComputedAtom {\n return obj !== null && typeof obj === 'object' && COMPUTED_BRAND in obj;\n}\n\n/**\n * Effect object check.\n */\nexport function isEffect(obj: unknown): obj is EffectObject {\n return obj !== null && typeof obj === 'object' && EFFECT_BRAND in obj;\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 {\n AsyncState,\n COMPUTED_CONFIG,\n COMPUTED_STATE_FLAGS,\n EMPTY_ERROR_ARRAY,\n IS_DEV,\n} from '@/constants';\nimport { ReactiveDependency } from '@/core/base';\nimport {\n DependencyLink,\n type Subscription,\n syncDependencies,\n trackDependency,\n} from '@/core/dep-tracking';\nimport { ComputedError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport { nextEpoch, nextVersion } from '@/internal/epoch';\nimport { EMPTY_LINKS, linksArrayPool } from '@/internal/pool';\nimport { ATOM_BRAND, COMPUTED_BRAND } from '@/symbols';\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\nconst { IDLE, DIRTY, PENDING, RESOLVED, REJECTED, HAS_ERROR, RECOMPUTING, DISPOSED, IS_COMPUTED } =\n COMPUTED_STATE_FLAGS;\n\nfunction getAsyncState(flags: number): AsyncStateType {\n if (flags & RESOLVED) return AsyncState.RESOLVED;\n if (flags & PENDING) return AsyncState.PENDING;\n if (flags & REJECTED) return AsyncState.REJECTED;\n return AsyncState.IDLE;\n}\n\n/**\n * Computed atom implementation.\n */\nclass ComputedAtomImpl<T> extends ReactiveDependency<T> implements ComputedAtom<T>, Subscriber {\n /** @internal */\n readonly [ATOM_BRAND] = true;\n /** @internal */\n readonly [COMPUTED_BRAND] = true;\n\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 private readonly _maxAsyncRetries: number;\n\n protected _subscribers: Subscription<T>[] = [];\n private _links: DependencyLink[] = EMPTY_LINKS;\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;\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 = IS_COMPUTED | DIRTY | 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 const retries = options.maxAsyncRetries;\n this._maxAsyncRetries =\n retries != null && retries >= 0 ? retries : COMPUTED_CONFIG.MAX_ASYNC_RETRIES;\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 {\n /* _handleError already stored error and called onError */\n }\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 ((flags & (RESOLVED | DIRTY | IDLE)) === RESOLVED) {\n return this._value;\n }\n\n if (flags & DISPOSED) {\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_DISPOSED);\n }\n\n if (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 & (DIRTY | IDLE)) {\n this._recompute();\n // Re-read flags after update\n if (this.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 & PENDING) {\n if (hasDef) return def;\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n\n if (this.flags & REJECTED) {\n if (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 getAsyncState(this.flags);\n }\n\n get hasError(): boolean {\n this._track();\n if (this.flags & (REJECTED | HAS_ERROR)) return true;\n\n // Live scan: deps may have changed error state asynchronously\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 & HAS_ERROR) return true;\n }\n return false;\n }\n\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 // 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 & HAS_ERROR) {\n const computedDep = dep as unknown as ComputedAtom<unknown>;\n const depErrors = computedDep.errors;\n if (depErrors.length > 0) {\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 return Object.freeze(collected);\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 & PENDING) !== 0;\n }\n\n get isResolved(): boolean {\n this._track();\n return (this.flags & RESOLVED) !== 0;\n }\n\n invalidate(): void {\n this._markDirty();\n }\n\n dispose(): void {\n if (this.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;\n }\n\n this._subscribers.length = 0;\n this.flags = DISPOSED | DIRTY | IDLE;\n\n // Release Memory\n this._error = null;\n this._value = undefined as T;\n }\n\n [Symbol.dispose](): void {\n this.dispose();\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 _recompute(): void {\n if (this.flags & RECOMPUTING) return;\n this.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 // Inline _commitDeps\n this._trackLinks.length = this._trackCount;\n syncDependencies(this._trackLinks, prevLinks, this);\n this._links = this._trackLinks;\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._trackLinks.length = this._trackCount;\n syncDependencies(this._trackLinks, prevLinks, this);\n this._links = this._trackLinks;\n committed = true;\n } catch (commitErr) {\n if (IS_DEV) {\n console.warn('[atom-effect] _commitDeps failed during error recovery:', commitErr);\n }\n }\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;\n this._trackCount = 0;\n this.flags &= ~RECOMPUTING;\n }\n }\n\n private _handleAsyncComputation(promise: Promise<T>): void {\n // Set pending, clear idle/dirty/resolved/rejected\n this.flags = (this.flags | PENDING) & ~(IDLE | DIRTY | RESOLVED | REJECTED);\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) % COMPUTED_CONFIG.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++ < this._maxAsyncRetries) {\n return this._markDirty(); // Retry\n }\n return this._handleError(\n new ComputedError(\n `Async drift threshold exceeded after ${this._maxAsyncRetries} retries.`\n ),\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 hash = 0;\n const links = this._links;\n for (let i = 0, len = links.length; i < len; i++) {\n hash = ((hash << 5) - hash + links[i]!.node.version) | 0;\n }\n return hash;\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 & REJECTED)) {\n this.version = nextVersion(this.version);\n }\n\n this._error = error;\n // Set rejected + has_error, clear idle/dirty/pending/resolved\n this.flags = (this.flags & ~(IDLE | DIRTY | PENDING | RESOLVED)) | REJECTED | 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 & RESOLVED) || !this._equal(this._value, value)) {\n this.version = nextVersion(this.version);\n }\n\n this._value = value;\n this._error = null;\n // Set resolved, clear idle/dirty/pending/rejected/has_error\n this.flags = (this.flags | RESOLVED) & ~(IDLE | DIRTY | PENDING | REJECTED | HAS_ERROR);\n }\n\n execute(): void {\n // Subscriber implementation\n this._markDirty();\n }\n\n /** @internal */\n _markDirty(): void {\n if (this.flags & (RECOMPUTING | DIRTY)) return;\n this.flags |= DIRTY;\n this._notifySubscribers(undefined, undefined);\n }\n}\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 {\n COMPUTED_STATE_FLAGS,\n DEBUG_CONFIG,\n EFFECT_STATE_FLAGS,\n IS_DEV,\n SCHEDULER_CONFIG,\n} 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 currentFlushEpoch,\n flushExecutionCount,\n incrementFlushExecutionCount,\n nextEpoch,\n} from '@/internal/epoch';\nimport { EMPTY_LINKS, linksArrayPool } from '@/internal/pool';\nimport { scheduler } from '@/internal/scheduler';\nimport { EFFECT_BRAND } from '@/symbols';\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 /** @internal */\n readonly [EFFECT_BRAND] = true;\n\n private _cleanup: (() => void) | null = null;\n private _links: DependencyLink[] = EMPTY_LINKS;\n private _nextLinks: DependencyLink[] | null = null;\n private _prevLinks: DependencyLink[] = EMPTY_LINKS;\n\n /** Pre-allocated scheduler task (created once in constructor) */\n private readonly _executeTask: (() => void) | undefined;\n\n /** Pre-allocated notify callback shared by all subscriptions */\n private readonly _notifyCallback: () => void;\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 // Frequency tracking (Dev)\n private _executionCount = 0;\n private _windowStart = 0;\n private _windowCount = 0;\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 // Pre-allocate callbacks once — eliminates per-dependency closure allocation\n if (this._sync) {\n this._executeTask = undefined;\n this._notifyCallback = () => this.execute();\n } else {\n this._executeTask = () => this.execute();\n this._notifyCallback = () => scheduler.schedule(this._executeTask!);\n }\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._unsubLinks(this._links);\n if (this._links !== EMPTY_LINKS) {\n linksArrayPool.release(this._links);\n }\n\n // Reset State\n this._links = EMPTY_LINKS;\n this._prevLinks = EMPTY_LINKS;\n }\n\n [Symbol.dispose](): void {\n this.dispose();\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 const startEpoch = this._currentEpoch;\n\n // Deduplicate in current epoch\n if (dep._lastSeenEpoch === startEpoch) return;\n dep._lastSeenEpoch = startEpoch;\n\n const nextLinks = this._nextLinks!;\n\n // Reclaim existing subscription from previous links (linear scan — typically 1-10 deps)\n const prev = this._prevLinks;\n for (let i = 0, len = prev.length; i < len; i++) {\n const link = prev[i];\n if (link && link.node === dep && link.unsub) {\n // Reuse DependencyLink object — update version, move to nextLinks\n link.version = dep.version;\n nextLinks.push(link);\n prev[i] = null!; // Mark as reclaimed (avoid double-reclaim)\n return;\n }\n }\n\n try {\n const unsubscribe = dep.subscribe(this._notifyCallback);\n nextLinks.push(new DependencyLink(dep, dep.version, unsubscribe));\n } catch (error) {\n const wrapped = wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_EXECUTION_FAILED);\n console.error(wrapped);\n if (this._onError) {\n try {\n this._onError(wrapped);\n } catch {}\n }\n // Add noop link so next execution can attempt re-subscription\n nextLinks.push(new DependencyLink(dep, dep.version, undefined));\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 // Store prevLinks on instance for addDependency's linear reclaim scan\n this._prevLinks = this._links;\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 // 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 — assign links before marking committed\n // so _finalizeDependencies can clean up prevLinks correctly\n this._links = nextLinks;\n committed = true;\n this._handleExecutionError(error);\n this._cleanup = null;\n } finally {\n this._finalizeDependencies(committed, this._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 this._prevLinks = EMPTY_LINKS;\n\n if (committed) {\n // Cleanup unclaimed prev subscriptions (entries not nulled out by addDependency)\n for (let i = 0, len = prevLinks.length; i < len; i++) {\n const link = prevLinks[i];\n if (link) link.unsub?.();\n }\n\n if (prevLinks !== EMPTY_LINKS) {\n linksArrayPool.release(prevLinks);\n }\n } else {\n // Abort and restore\n this._unsubLinks(nextLinks);\n linksArrayPool.release(nextLinks);\n }\n }\n\n private _unsubLinks(links: DependencyLink[]): void {\n for (let i = 0, len = links.length; i < len; i++) {\n links[i]?.unsub?.();\n }\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\n // Trigger recomputation for computed dependencies\n if (dep.flags & COMPUTED_STATE_FLAGS.IS_COMPUTED) {\n try {\n // Force computed to re-evaluate so version reflects latest state\n void (dep as { value: unknown }).value;\n } catch {\n if (IS_DEV) {\n console.warn(`[atom-effect] Dependency #${dep.id} threw during dirty check`);\n }\n return true; // Error usually implies dirty/re-eval needed\n }\n }\n\n // Version Check\n if (dep.version !== link.version) return true;\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 = currentFlushEpoch();\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 (dev only)\n if (IS_DEV && Number.isFinite(this._maxExecutions)) {\n const now = Date.now();\n if (now - this._windowStart >= DEBUG_CONFIG.EFFECT_FREQUENCY_WINDOW) {\n this._windowStart = now;\n this._windowCount = 1;\n } else if (++this._windowCount > this._maxExecutions) {\n const err = new EffectError(ERROR_MESSAGES.EFFECT_FREQUENCY_LIMIT_EXCEEDED);\n this.dispose();\n this._handleExecutionError(err);\n 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\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":["AsyncState","EFFECT_STATE_FLAGS","COMPUTED_STATE_FLAGS","ATOM_STATE_FLAGS","POOL_CONFIG","SCHEDULER_CONFIG","DEBUG_CONFIG","COMPUTED_CONFIG","SMI_MAX","IS_DEV","EMPTY_ERROR_ARRAY","AtomError","message","cause","recoverable","ComputedError","EffectError","SchedulerError","DEBUG_NAME","DEBUG_TYPE","NO_DEFAULT_VALUE","debug","cond","msg","dep","current","obj","type","id","nextId","generateId","trackDependency","dependency","subscribers","fn","i","len","link","Subscription","sub","syncDependencies","nextLinks","prevLinks","tracker","parked","node","existing","unsub","DependencyLink","version","ERROR_MESSAGES","max","dropped","wrapError","error","ErrorClass","context","isNativeError","originalMessage","finalMessage","ReactiveNode","ReactiveDependency","listener","isFn","subs","idx","last","newValue","oldValue","s","err","collectorEpoch","nextEpoch","nextVersion","v","flushExecutionCount","isFlushing","_flushEpoch","currentFlushEpoch","startFlush","endFlush","incrementFlushExecutionCount","Scheduler","callback","started","epoch","bQueue","targetBuffer","currentSize","job","iterations","jobs","count","e","droppedCount","scheduler","ATOM_BRAND","COMPUTED_BRAND","EFFECT_BRAND","trackingContext","prev","untracked","_a","AtomImpl","initialValue","sync","flags","atom","options","ArrayPool","limit","capacity","enableStats","arr","emptyConst","acquired","released","rejected","leakCount","EMPTY_LINKS","linksArrayPool","isAtom","isComputed","isEffect","isPromise","value","_b","IDLE","DIRTY","PENDING","RESOLVED","REJECTED","HAS_ERROR","RECOMPUTING","DISPOSED","IS_COMPUTED","getAsyncState","ComputedAtomImpl","retries","def","hasDef","links","collected","depErrors","j","committed","result","promise","promiseId","res","hash","throwErr","computed","EffectImpl","startEpoch","unsubscribe","wrapped","force","execId","cleanup","prevContext","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/symbols.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 * 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 * Effect flags.\n */\nexport const EFFECT_STATE_FLAGS = {\n DISPOSED: 1 << 0,\n EXECUTING: 1 << 3,\n} as const;\n\n/**\n * Computed flags.\n */\nexport const COMPUTED_STATE_FLAGS = {\n DISPOSED: 1 << 0,\n /** Marker bit: identifies this node as a computed. */\n IS_COMPUTED: 1 << 1,\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 DISPOSED: 1 << 0,\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 ENABLE_STATS: false,\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 BATCH_QUEUE_SHRINK_THRESHOLD: 1000,\n} as const;\n\n/**\n * Debugging thresholds.\n */\nexport const DEBUG_CONFIG = {\n WARN_INFINITE_LOOP: true,\n EFFECT_FREQUENCY_WINDOW: 1000,\n} as const;\n\n/**\n * Computed configuration.\n */\nexport const COMPUTED_CONFIG = {\n MAX_ASYNC_RETRIES: 3,\n MAX_PROMISE_ID: Number.MAX_SAFE_INTEGER - 1,\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 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 // Check dependencies\n dep.dependencies.forEach((child) => {\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 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 = (): DependencyId => nextId++;\n","import 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: Subscription<T>[]\n): void {\n if (typeof current === 'function') {\n const fn = current as (newValue?: T, oldValue?: T) => void;\n // O(n) duplicate check — acceptable because:\n // 1. subscribers array is typically 1-10 elements\n // 2. DependencySubscriber (hot path) uses O(1) epoch-based dedup via addDependency\n // 3. This branch only runs for raw function listeners (uncommon)\n if (subscribers.some((link) => link && link.fn === fn)) return;\n subscribers.push(new Subscription(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 if (subscribers.some((link) => link && link.sub === sub)) return;\n subscribers.push(new Subscription(undefined, sub));\n}\n\n/**\n * Syncs dependencies.\n * Uses a local Map to park previous subscriptions, avoiding\n * temporary state on dependency nodes.\n */\nexport function syncDependencies(\n nextLinks: DependencyLink[],\n prevLinks: DependencyLink[],\n tracker: Subscriber\n): void {\n // Park: collect previous subscriptions into a local Map\n const parked = new Map<Dependency, () => void>();\n prevLinks.forEach((link) => {\n if (link?.unsub) {\n parked.set(link.node, link.unsub);\n }\n });\n\n // Reclaim or subscribe\n nextLinks.forEach((link) => {\n if (!link) return;\n\n const node = link.node;\n const existing = parked.get(node);\n if (existing !== undefined) {\n // Re-link: reclaim subscription from previous set\n link.unsub = existing;\n parked.delete(node);\n } else {\n // New link: subscribe afresh\n debug.checkCircular(node, tracker);\n link.unsub = node.subscribe(tracker);\n }\n });\n\n // Cleanup: release unused subscriptions\n parked.forEach((unsub) => unsub());\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 * Subscription entry.\n */\nexport class Subscription<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 // Scheduler Errors\n SCHEDULER_FLUSH_OVERFLOW: (max: number, dropped: number): string =>\n `Maximum flush iterations (${max}) exceeded. ${dropped} jobs dropped. Possible infinite loop.`,\n\n // System / Debug\n CALLBACK_ERROR_IN_ERROR_HANDLER: 'Exception encountered in onError handler',\n\n // Effect frequency\n EFFECT_FREQUENCY_LIMIT_EXCEEDED:\n 'Effect executed too frequently within 1 second. Suspected infinite loop.',\n\n SCHEDULER_CALLBACK_MUST_BE_FUNCTION: 'Scheduler callback must be a function',\n SCHEDULER_END_BATCH_WITHOUT_START: 'endBatch() called without matching startBatch(). Ignoring.',\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 const type = isNativeError ? error.constructor.name : 'Unexpected error';\n const finalMessage = `${type} (${context}): ${originalMessage}`;\n\n return new ErrorClass(finalMessage, cause);\n}\n","import { IS_DEV, SMI_MAX } from '@/constants';\nimport { Subscription } 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 /** Debug ID */\n readonly id: DependencyId = generateId() & SMI_MAX;\n}\n\n/**\n * Reactive dependency base class.\n */\nexport abstract class ReactiveDependency<T> extends ReactiveNode {\n protected abstract _subscribers: Subscription<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 if (\n this._subscribers.some((sub) => {\n if (!sub) return false;\n return isFn ? sub.fn === listener : sub.sub === listener;\n })\n ) {\n if (IS_DEV) console.warn('Duplicate subscription ignored.');\n return () => {};\n }\n\n const link = new Subscription<T>(\n isFn ? (listener as (newValue?: T, oldValue?: T) => void) : undefined,\n !isFn ? (listener as Subscriber) : undefined\n );\n\n const subs = this._subscribers;\n subs.push(link);\n\n return () => this._unsubscribe(link);\n }\n\n private _unsubscribe(link: Subscription<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.slice(0);\n subs.forEach((s) => {\n if (!s) return;\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\n/** Increments a version counter within SMI range. */\nexport const nextVersion = (v: number) => (v + 1) & SMI_MAX;\n\nexport let flushExecutionCount = 0;\nlet isFlushing = false;\nlet _flushEpoch = 0;\n\n/** Current flush epoch. */\nexport const currentFlushEpoch = () => _flushEpoch;\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 = nextEpoch();\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 { ERROR_MESSAGES } from '@/errors/messages';\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 */\nclass Scheduler {\n /** Queue buffer */\n _queueBuffer: [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: SchedulerJob[] = [];\n _batchQueueSize = 0;\n\n /** Config */\n _maxFlushIterations: number = SCHEDULER_CONFIG.MAX_FLUSH_ITERATIONS;\n\n /** Overflow callback */\n onOverflow: ((droppedCount: number) => void) | null = null;\n\n /** Bound run loop for microtask */\n private readonly _boundRunLoop = this._runLoop.bind(this);\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(ERROR_MESSAGES.SCHEDULER_CALLBACK_MUST_BE_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._boundRunLoop);\n }\n\n /**\n * Scheduler loop.\n */\n private _runLoop(): void {\n try {\n if (this._size === 0) return;\n\n const started = startFlush();\n this._drainQueue();\n if (started) endFlush();\n } finally {\n this._isProcessing = false;\n // If new jobs arrived during flush (and not batching), re-schedule\n if (this._size > 0 && !this._isBatching) {\n this._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 bQueue.slice(0, this._batchQueueSize).forEach((job) => {\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 // Execute jobs\n for (let i = 0; i < count; i++) {\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 private _handleFlushOverflow(): void {\n const droppedCount = this._size + this._batchQueueSize;\n console.error(\n new SchedulerError(\n ERROR_MESSAGES.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations, droppedCount)\n )\n );\n this._size = 0;\n this._queueBuffer[this._bufferIndex]!.length = 0;\n this._batchQueueSize = 0;\n\n if (this.onOverflow) {\n try {\n this.onOverflow(droppedCount);\n } catch {}\n }\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(ERROR_MESSAGES.SCHEDULER_END_BATCH_WITHOUT_START);\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\nexport const scheduler = new Scheduler();\n","/**\n * Brand symbols for reliable type identification.\n * Prevents false positives from duck-typing with external objects.\n */\nexport const ATOM_BRAND: unique symbol = Symbol.for('atom-effect/atom');\nexport const COMPUTED_BRAND: unique symbol = Symbol.for('atom-effect/computed');\nexport const EFFECT_BRAND: unique symbol = Symbol.for('atom-effect/effect');\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 } from '@/constants';\nimport { ReactiveDependency } from '@/core/base';\nimport { type Subscription, trackDependency } from '@/core/dep-tracking';\nimport { nextVersion } from '@/internal/epoch';\nimport { scheduler } from '@/internal/scheduler';\nimport { ATOM_BRAND } from '@/symbols';\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 readonly _notifyTask = () => this._flushNotifications();\n protected _subscribers: Subscription<T>[] = [];\n\n /** @internal */\n readonly [ATOM_BRAND] = true;\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 = nextVersion(this.version);\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 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 }\n\n [Symbol.dispose](): void {\n this.dispose();\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 when disabled\n private stats: {\n acquired: number;\n released: number;\n rejected: { frozen: number; tooLarge: number; poolFull: number };\n } | null = 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 * @param enableStats - Force-enable stats even in production (default: false).\n */\n constructor(\n private readonly limit = 50,\n private readonly capacity = 256,\n enableStats = false\n ) {\n this.stats =\n IS_DEV || enableStats\n ? {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 },\n }\n : null;\n }\n\n /**\n * Acquires array.\n */\n acquire(): T[] {\n if (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 (this.stats) this.stats.rejected.tooLarge++;\n return;\n }\n\n if (this.pool.length >= this.limit) {\n if (this.stats) this.stats.rejected.poolFull++;\n return;\n }\n\n if (Object.isFrozen(arr)) {\n if (this.stats) this.stats.rejected.frozen++;\n return;\n }\n\n arr.length = 0;\n this.pool.push(arr);\n\n if (this.stats) {\n this.stats.released++;\n }\n }\n\n /**\n * Pool stats.\n */\n getStats(): PoolStats | null {\n if (!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 (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 { ArrayPool } from '@/utils/array-pool';\n\nexport const EMPTY_LINKS: DependencyLink[] = Object.freeze(\n [] as unknown as DependencyLink[]\n) as DependencyLink[];\n\nexport const linksArrayPool = new ArrayPool<DependencyLink>();\n","import { ATOM_BRAND, COMPUTED_BRAND, EFFECT_BRAND } from '@/symbols';\nimport 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 obj !== null && typeof obj === 'object' && ATOM_BRAND in obj;\n}\n\n/**\n * Writable atom check.\n */\nexport function isWritable(obj: unknown): obj is WritableAtom {\n return isAtom(obj) && !isComputed(obj);\n}\n\n/**\n * Computed atom check.\n */\nexport function isComputed(obj: unknown): obj is ComputedAtom {\n return obj !== null && typeof obj === 'object' && COMPUTED_BRAND in obj;\n}\n\n/**\n * Effect object check.\n */\nexport function isEffect(obj: unknown): obj is EffectObject {\n return obj !== null && typeof obj === 'object' && EFFECT_BRAND in obj;\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 {\n AsyncState,\n COMPUTED_CONFIG,\n COMPUTED_STATE_FLAGS,\n EMPTY_ERROR_ARRAY,\n IS_DEV,\n SMI_MAX,\n} from '@/constants';\nimport { ReactiveDependency } from '@/core/base';\nimport {\n DependencyLink,\n type Subscription,\n syncDependencies,\n trackDependency,\n} from '@/core/dep-tracking';\nimport { ComputedError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport { nextEpoch, nextVersion } from '@/internal/epoch';\nimport { EMPTY_LINKS, linksArrayPool } from '@/internal/pool';\nimport { ATOM_BRAND, COMPUTED_BRAND } from '@/symbols';\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\nconst { IDLE, DIRTY, PENDING, RESOLVED, REJECTED, HAS_ERROR, RECOMPUTING, DISPOSED, IS_COMPUTED } =\n COMPUTED_STATE_FLAGS;\n\nfunction getAsyncState(flags: number): AsyncStateType {\n if (flags & RESOLVED) return AsyncState.RESOLVED;\n if (flags & PENDING) return AsyncState.PENDING;\n if (flags & REJECTED) return AsyncState.REJECTED;\n return AsyncState.IDLE;\n}\n\n/**\n * Computed atom implementation.\n */\nclass ComputedAtomImpl<T> extends ReactiveDependency<T> implements ComputedAtom<T>, Subscriber {\n /** @internal */\n readonly [ATOM_BRAND] = true;\n /** @internal */\n readonly [COMPUTED_BRAND] = true;\n\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 private readonly _maxAsyncRetries: number;\n\n protected _subscribers: Subscription<T>[] = [];\n private _links: DependencyLink[] = EMPTY_LINKS;\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;\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 = IS_COMPUTED | DIRTY | 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 const retries = options.maxAsyncRetries;\n this._maxAsyncRetries = (retries ?? COMPUTED_CONFIG.MAX_ASYNC_RETRIES) & SMI_MAX;\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 {\n /* _handleError already stored error and called onError */\n }\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 ((flags & (RESOLVED | DIRTY | IDLE)) === RESOLVED) {\n return this._value;\n }\n\n if (flags & DISPOSED) {\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_DISPOSED);\n }\n\n if (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 & (DIRTY | IDLE)) {\n this._recompute();\n // Re-read flags after update\n if (this.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 & PENDING) {\n if (hasDef) return def;\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n\n if (this.flags & REJECTED) {\n if (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 getAsyncState(this.flags);\n }\n\n get hasError(): boolean {\n this._track();\n if (this.flags & (REJECTED | HAS_ERROR)) return true;\n\n // Live scan: deps may have changed error state asynchronously\n return this._links.some((link) => link?.node?.flags & HAS_ERROR);\n }\n\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 // 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 links.forEach((link) => {\n const dep = link.node;\n if (dep.flags & HAS_ERROR) {\n const computedDep = dep as unknown as ComputedAtom<unknown>;\n computedDep.errors.forEach((err) => {\n if (err && !collected.includes(err)) collected.push(err);\n });\n }\n });\n\n return Object.freeze(collected);\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 & PENDING) !== 0;\n }\n\n get isResolved(): boolean {\n this._track();\n return (this.flags & RESOLVED) !== 0;\n }\n\n invalidate(): void {\n this._markDirty();\n }\n\n dispose(): void {\n if (this.flags & DISPOSED) return;\n\n const links = this._links;\n if (links !== EMPTY_LINKS) {\n links.forEach((link) => link!.unsub?.());\n linksArrayPool.release(links);\n this._links = EMPTY_LINKS;\n }\n\n this._subscribers.length = 0;\n this.flags = DISPOSED | DIRTY | IDLE;\n\n // Release Memory\n this._error = null;\n this._value = undefined as T;\n }\n\n [Symbol.dispose](): void {\n this.dispose();\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 _recompute(): void {\n if (this.flags & RECOMPUTING) return;\n this.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 // Inline _commitDeps\n this._trackLinks.length = this._trackCount;\n syncDependencies(this._trackLinks, prevLinks, this);\n this._links = this._trackLinks;\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._trackLinks.length = this._trackCount;\n syncDependencies(this._trackLinks, prevLinks, this);\n this._links = this._trackLinks;\n committed = true;\n } catch (commitErr) {\n if (IS_DEV) {\n console.warn('[atom-effect] _commitDeps failed during error recovery:', commitErr);\n }\n }\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;\n this._trackCount = 0;\n this.flags &= ~RECOMPUTING;\n }\n }\n\n private _handleAsyncComputation(promise: Promise<T>): void {\n // Set pending, clear idle/dirty/resolved/rejected\n this.flags = (this.flags | PENDING) & ~(IDLE | DIRTY | RESOLVED | REJECTED);\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) % COMPUTED_CONFIG.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++ < this._maxAsyncRetries) {\n return this._markDirty(); // Retry\n }\n return this._handleError(\n new ComputedError(\n `Async drift threshold exceeded after ${this._maxAsyncRetries} retries.`\n ),\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 hash = 0;\n const links = this._links;\n for (let i = 0, len = links.length; i < len; i++) {\n hash = ((hash << 5) - hash + links[i]!.node.version) | 0;\n }\n return hash;\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 & REJECTED)) {\n this.version = nextVersion(this.version);\n }\n\n this._error = error;\n // Set rejected + has_error, clear idle/dirty/pending/resolved\n this.flags = (this.flags & ~(IDLE | DIRTY | PENDING | RESOLVED)) | REJECTED | 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 & RESOLVED) || !this._equal(this._value, value)) {\n this.version = nextVersion(this.version);\n }\n\n this._value = value;\n this._error = null;\n // Set resolved, clear idle/dirty/pending/rejected/has_error\n this.flags = (this.flags | RESOLVED) & ~(IDLE | DIRTY | PENDING | REJECTED | HAS_ERROR);\n }\n\n execute(): void {\n // Subscriber implementation\n this._markDirty();\n }\n\n /** @internal */\n _markDirty(): void {\n if (this.flags & (RECOMPUTING | DIRTY)) return;\n this.flags |= DIRTY;\n this._notifySubscribers(undefined, undefined);\n }\n}\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 {\n COMPUTED_STATE_FLAGS,\n DEBUG_CONFIG,\n EFFECT_STATE_FLAGS,\n IS_DEV,\n SCHEDULER_CONFIG,\n} 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 currentFlushEpoch,\n flushExecutionCount,\n incrementFlushExecutionCount,\n nextEpoch,\n} from '@/internal/epoch';\nimport { EMPTY_LINKS, linksArrayPool } from '@/internal/pool';\nimport { scheduler } from '@/internal/scheduler';\nimport { EFFECT_BRAND } from '@/symbols';\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 /** @internal */\n readonly [EFFECT_BRAND] = true;\n\n private _cleanup: (() => void) | null = null;\n private _links: DependencyLink[] = EMPTY_LINKS;\n private _nextLinks: DependencyLink[] | null = null;\n private _prevLinks: DependencyLink[] = EMPTY_LINKS;\n\n /** Pre-allocated scheduler task (created once in constructor) */\n private readonly _executeTask: (() => void) | undefined;\n\n /** Pre-allocated notify callback shared by all subscriptions */\n private readonly _notifyCallback: () => void;\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 // Frequency tracking (Dev)\n private _executionCount = 0;\n private _windowStart = 0;\n private _windowCount = 0;\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 // Pre-allocate callbacks once — eliminates per-dependency closure allocation\n if (this._sync) {\n this._executeTask = undefined;\n this._notifyCallback = () => this.execute();\n } else {\n this._executeTask = () => this.execute();\n this._notifyCallback = () => scheduler.schedule(this._executeTask!);\n }\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._unsubLinks(this._links);\n if (this._links !== EMPTY_LINKS) {\n linksArrayPool.release(this._links);\n }\n\n // Reset State\n this._links = EMPTY_LINKS;\n this._prevLinks = EMPTY_LINKS;\n }\n\n [Symbol.dispose](): void {\n this.dispose();\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 const startEpoch = this._currentEpoch;\n\n // Deduplicate in current epoch\n if (dep._lastSeenEpoch === startEpoch) return;\n dep._lastSeenEpoch = startEpoch;\n\n const nextLinks = this._nextLinks!;\n\n // Reclaim existing subscription from previous links (linear scan — typically 1-10 deps)\n const prev = this._prevLinks;\n const existingIndex = prev.findIndex((link) => link && link.node === dep && link.unsub);\n\n if (existingIndex !== -1) {\n const link = prev[existingIndex]!;\n // Reuse DependencyLink object — update version, move to nextLinks\n link.version = dep.version;\n nextLinks.push(link);\n prev[existingIndex] = null!; // Mark as reclaimed (avoid double-reclaim)\n return;\n }\n\n try {\n const unsubscribe = dep.subscribe(this._notifyCallback);\n nextLinks.push(new DependencyLink(dep, dep.version, unsubscribe));\n } catch (error) {\n const wrapped = wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_EXECUTION_FAILED);\n console.error(wrapped);\n if (this._onError) {\n try {\n this._onError(wrapped);\n } catch {}\n }\n // Add noop link so next execution can attempt re-subscription\n nextLinks.push(new DependencyLink(dep, dep.version, undefined));\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 // Store prevLinks on instance for addDependency's linear reclaim scan\n this._prevLinks = this._links;\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 // 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 — assign links before marking committed\n // so _finalizeDependencies can clean up prevLinks correctly\n this._links = nextLinks;\n committed = true;\n this._handleExecutionError(error);\n this._cleanup = null;\n } finally {\n this._finalizeDependencies(committed, this._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 this._prevLinks = EMPTY_LINKS;\n\n if (committed) {\n // Cleanup unclaimed prev subscriptions (entries not nulled out by addDependency)\n prevLinks.forEach((link) => link?.unsub?.());\n\n if (prevLinks !== EMPTY_LINKS) {\n linksArrayPool.release(prevLinks);\n }\n } else {\n // Abort and restore\n this._unsubLinks(nextLinks);\n linksArrayPool.release(nextLinks);\n }\n }\n\n private _unsubLinks(links: DependencyLink[]): void {\n links.forEach((link) => link?.unsub?.());\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 return links.some((link) => {\n const dep = link.node;\n\n // Trigger recomputation for computed dependencies\n if (dep.flags & COMPUTED_STATE_FLAGS.IS_COMPUTED) {\n try {\n // Force computed to re-evaluate so version reflects latest state\n void (dep as { value: unknown }).value;\n } catch {\n if (IS_DEV) {\n console.warn(`[atom-effect] Dependency #${dep.id} threw during dirty check`);\n }\n return true; // Error usually implies dirty/re-eval needed\n }\n }\n\n // Version Check\n return dep.version !== link.version;\n });\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 = currentFlushEpoch();\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 (dev only)\n if (IS_DEV && Number.isFinite(this._maxExecutions)) {\n const now = Date.now();\n if (now - this._windowStart >= DEBUG_CONFIG.EFFECT_FREQUENCY_WINDOW) {\n this._windowStart = now;\n this._windowCount = 1;\n } else if (++this._windowCount > this._maxExecutions) {\n const err = new EffectError(ERROR_MESSAGES.EFFECT_FREQUENCY_LIMIT_EXCEEDED);\n this.dispose();\n this._handleExecutionError(err);\n 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\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":["AsyncState","EFFECT_STATE_FLAGS","COMPUTED_STATE_FLAGS","ATOM_STATE_FLAGS","POOL_CONFIG","SCHEDULER_CONFIG","DEBUG_CONFIG","COMPUTED_CONFIG","SMI_MAX","IS_DEV","EMPTY_ERROR_ARRAY","AtomError","message","cause","recoverable","ComputedError","EffectError","SchedulerError","DEBUG_NAME","DEBUG_TYPE","NO_DEFAULT_VALUE","debug","cond","msg","dep","current","obj","type","id","nextId","generateId","trackDependency","dependency","subscribers","fn","link","Subscription","sub","syncDependencies","nextLinks","prevLinks","tracker","parked","node","existing","unsub","DependencyLink","version","ERROR_MESSAGES","max","dropped","wrapError","error","ErrorClass","context","isNativeError","originalMessage","finalMessage","ReactiveNode","ReactiveDependency","listener","isFn","subs","idx","last","newValue","oldValue","s","err","collectorEpoch","nextEpoch","nextVersion","v","flushExecutionCount","isFlushing","_flushEpoch","currentFlushEpoch","startFlush","endFlush","incrementFlushExecutionCount","Scheduler","callback","started","epoch","bQueue","targetBuffer","currentSize","job","iterations","jobs","count","i","e","droppedCount","scheduler","ATOM_BRAND","COMPUTED_BRAND","EFFECT_BRAND","trackingContext","prev","untracked","_a","AtomImpl","initialValue","sync","flags","atom","options","ArrayPool","limit","capacity","enableStats","arr","emptyConst","acquired","released","rejected","leakCount","EMPTY_LINKS","linksArrayPool","isAtom","isComputed","isEffect","isPromise","value","_b","IDLE","DIRTY","PENDING","RESOLVED","REJECTED","HAS_ERROR","RECOMPUTING","DISPOSED","IS_COMPUTED","getAsyncState","ComputedAtomImpl","retries","def","hasDef","collected","links","committed","result","promise","promiseId","res","hash","len","throwErr","computed","EffectImpl","startEpoch","existingIndex","unsubscribe","wrapped","force","execId","cleanup","prevContext","errorObj","effect","effectInstance","batch"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b={IDLE:"idle",PENDING:"pending",RESOLVED:"resolved",REJECTED:"rejected"},l={DISPOSED:1,EXECUTING:8},Z={DISPOSED:1,IS_COMPUTED:2,DIRTY:8,IDLE:16,PENDING:32,RESOLVED:64,REJECTED:128,RECOMPUTING:256,HAS_ERROR:512},a={DISPOSED:1,SYNC:8,NOTIFICATION_SCHEDULED:16},ht={MAX_SIZE:1e3,WARMUP_SIZE:100,ENABLE_STATS:!1},E={MAX_EXECUTIONS_PER_SECOND:1e3,MAX_EXECUTIONS_PER_EFFECT:100,MAX_EXECUTIONS_PER_FLUSH:1e4,MAX_FLUSH_ITERATIONS:1e3,MIN_FLUSH_ITERATIONS:10,BATCH_QUEUE_SHRINK_THRESHOLD:1e3},tt={WARN_INFINITE_LOOP:!0,EFFECT_FREQUENCY_WINDOW:1e3},Q={MAX_ASYNC_RETRIES:3,MAX_PROMISE_ID:Number.MAX_SAFE_INTEGER-1},z=1073741823,et=typeof process<"u"&&process.env&&!1||!1,ct=Object.freeze([]);class S extends Error{constructor(t,e=null,s=!0){super(t),this.cause=e,this.recoverable=s,this.name="AtomError"}}class f extends S{constructor(t,e=null){super(t,e,!0),this.name="ComputedError"}}class I extends S{constructor(t,e=null){super(t,e,!1),this.name="EffectError"}}class F extends S{constructor(t,e=null){super(t,e,!1),this.name="SchedulerError"}}const ut=Symbol("AtomEffect.DebugName"),lt=Symbol("AtomEffect.Type"),x=Symbol("AtomEffect.NoDefaultValue"),N={enabled:et,warnInfiniteLoop:tt.WARN_INFINITE_LOOP,warn(i,t){},checkCircular(i,t){if(i===t)throw new f("Direct circular dependency detected")},attachDebugInfo(i,t,e){},getDebugName:i=>i?.[ut],getDebugType:i=>i?.[lt]};let _t=1;const at=()=>_t++;function st(i,t,e){if(typeof t=="function"){const n=t;for(let r=0,o=e.length;r<o;r++){const h=e[r];if(h&&h.fn===n)return}e.push(new B(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 o=e[n];if(o&&o.sub===s)return}e.push(new B(void 0,s))}function j(i,t,e){const s=new Map;for(let n=0,r=t.length;n<r;n++){const o=t[n];o?.unsub&&s.set(o.node,o.unsub)}for(let n=0,r=i.length;n<r;n++){const o=i[n];if(!o)continue;const h=o.node,g=s.get(h);g!==void 0?(o.unsub=g,s.delete(h)):(N.checkCircular(h,e),o.unsub=h.subscribe(e))}for(const n of s.values())n()}class M{constructor(t,e,s=void 0){this.node=t,this.version=e,this.unsub=s}}class B{constructor(t,e){this.fn=t,this.sub=e}}const c={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",SCHEDULER_FLUSH_OVERFLOW:(i,t)=>`Maximum flush iterations (${i}) exceeded. ${t} jobs dropped. Possible infinite loop.`,CALLBACK_ERROR_IN_ERROR_HANDLER:"Exception encountered in onError handler",EFFECT_FREQUENCY_LIMIT_EXCEEDED:"Effect executed too frequently within 1 second. Suspected infinite loop.",SCHEDULER_CALLBACK_MUST_BE_FUNCTION:"Scheduler callback must be a function",SCHEDULER_END_BATCH_WITHOUT_START:"endBatch() called without matching startBatch(). Ignoring."};function D(i,t,e){if(i instanceof S)return i;const s=i instanceof Error,n=s?i.message:String(i),r=s?i:void 0,h=`${s?i.constructor.name:"Unexpected error"} (${e}): ${n}`;return new t(h,r)}class it{constructor(){this.flags=0,this.version=0,this._lastSeenEpoch=-1,this.id=at()&z}}class nt extends it{subscribe(t){const e=typeof t=="function";if(!e&&(!t||typeof t.execute!="function"))throw D(new TypeError("Invalid subscriber"),S,c.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);const s=this._subscribers;for(let r=0,o=s.length;r<o;r++){const h=s[r];if(h&&(e?h.fn===t:h.sub===t))return()=>{}}const n=new B(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.slice(0),n=s.length;for(let r=0;r<n;r++){const o=s[r];if(o)try{o.fn?o.fn(t,e):o.sub&&o.sub.execute()}catch(h){this._handleNotifyError(h)}}}_handleNotifyError(t){console.error(D(t,S,c.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED))}}let P=0;const H=()=>(P=P+1&z||1,P),w=i=>i+1&z;let V=0,L=!1,rt=0;const ft=()=>rt;function Y(){return L?!1:(L=!0,rt=H(),V=0,!0)}const q=()=>{L=!1},Et=()=>L?++V:0;class dt{constructor(){this._queueBuffer=[[],[]],this._bufferIndex=0,this._size=0,this._epoch=0,this._isProcessing=!1,this._isBatching=!1,this._isFlushingSync=!1,this._batchDepth=0,this._batchQueue=[],this._batchQueueSize=0,this._maxFlushIterations=E.MAX_FLUSH_ITERATIONS,this.onOverflow=null,this._boundRunLoop=this._runLoop.bind(this)}get phase(){return this._isProcessing||this._isFlushingSync?2:this._isBatching?1:0}get queueSize(){return this._size}get isBatching(){return this._isBatching}schedule(t){if(t._nextEpoch!==this._epoch){if(t._nextEpoch=this._epoch,this._isBatching||this._isFlushingSync){this._batchQueue[this._batchQueueSize++]=t;return}this._queueBuffer[this._bufferIndex][this._size++]=t,this._isProcessing||this._flush()}}_flush(){this._isProcessing||this._size===0||(this._isProcessing=!0,queueMicrotask(this._boundRunLoop))}_runLoop(){try{if(this._size===0)return;const t=Y();this._drainQueue(),t&&q()}finally{this._isProcessing=!1,this._size>0&&!this._isBatching&&this._flush()}}_flushSync(){this._isFlushingSync=!0;const t=Y();try{this._mergeBatchQueue(),this._drainQueue()}finally{this._isFlushingSync=!1,t&&q()}}_mergeBatchQueue(){if(this._batchQueueSize===0)return;const t=++this._epoch,e=this._batchQueue,s=this._queueBuffer[this._bufferIndex];let n=this._size;for(let r=0;r<this._batchQueueSize;r++){const o=e[r];o._nextEpoch!==t&&(o._nextEpoch=t,s[n++]=o)}this._size=n,this._batchQueueSize=0,e.length>E.BATCH_QUEUE_SHRINK_THRESHOLD&&(e.length=0)}_drainQueue(){let t=0;for(;this._size>0;){if(++t>this._maxFlushIterations){this._handleFlushOverflow();return}this._processQueue(),this._mergeBatchQueue()}}_processQueue(){const t=this._bufferIndex,e=this._queueBuffer[t],s=this._size;this._bufferIndex=t^1,this._size=0,this._epoch++;for(let n=0;n<s;n++)try{e[n]()}catch(r){console.error(new F("Error occurred during scheduler execution",r))}e.length=0}_handleFlushOverflow(){const t=this._size+this._batchQueueSize;if(console.error(new F(c.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations,t))),this._size=0,this._queueBuffer[this._bufferIndex].length=0,this._batchQueueSize=0,this.onOverflow)try{this.onOverflow(t)}catch{}}startBatch(){this._batchDepth++,this._isBatching=!0}endBatch(){this._batchDepth!==0&&--this._batchDepth===0&&(this._flushSync(),this._isBatching=!1)}setMaxFlushIterations(t){if(t<E.MIN_FLUSH_ITERATIONS)throw new F(`Max flush iterations must be at least ${E.MIN_FLUSH_ITERATIONS}`);this._maxFlushIterations=t}}const O=new dt,m=Symbol.for("atom-effect/atom"),G=Symbol.for("atom-effect/computed"),X=Symbol.for("atom-effect/effect"),_={current:null,run(i,t){const e=this.current;this.current=i;try{return t()}finally{this.current=e}}};function pt(i){const t=_.current;if(t===null)return i();_.current=null;try{return i()}finally{_.current=t}}var $;class It extends nt{constructor(t,e){super(),this._pendingOldValue=void 0,this._notifyTask=()=>this._flushNotifications(),this._subscribers=[],this[$]=!0,this._value=t,e&&(this.flags|=a.SYNC),N.attachDebugInfo(this,"atom",this.id)}get value(){const t=_.current;return t&&st(this,t,this._subscribers),this._value}set value(t){const e=this._value;if(Object.is(e,t))return;this._value=t,this.version=w(this.version);const s=this.flags;if(!(this._subscribers.length===0||s&a.NOTIFICATION_SCHEDULED)){if(this._pendingOldValue=e,this.flags=s|a.NOTIFICATION_SCHEDULED,s&a.SYNC&&!O.isBatching){this._flushNotifications();return}O.schedule(this._notifyTask)}}_flushNotifications(){const t=this.flags;if(!(t&a.NOTIFICATION_SCHEDULED)||t&a.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&a.DISPOSED||(this._subscribers.length=0,this.flags|=a.DISPOSED,this._value=void 0,this._pendingOldValue=void 0)}[($=m,Symbol.dispose)](){this.dispose()}}function St(i,t={}){return new It(i,t.sync??!1)}class gt{constructor(t=50,e=256,s=!1){this.limit=t,this.capacity=e,this.pool=[],this.stats=null,this.stats=s?{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 u=Object.freeze([]),d=new gt;function Ct(i){return i!==null&&typeof i=="object"&&m in i}function Dt(i){return i!==null&&typeof i=="object"&&G in i}function Ot(i){return i!==null&&typeof i=="object"&&X in i}function ot(i){return i!==null&&typeof i=="object"&&typeof i.then=="function"}var W,K;const{IDLE:y,DIRTY:C,PENDING:k,RESOLVED:p,REJECTED:A,HAS_ERROR:R,RECOMPUTING:T,DISPOSED:v,IS_COMPUTED:Tt}=Z;function bt(i){return i&p?b.RESOLVED:i&k?b.PENDING:i&A?b.REJECTED:b.IDLE}class At extends nt{constructor(t,e={}){if(typeof t!="function")throw new f(c.COMPUTED_MUST_BE_FUNCTION);super(),this[K]=!0,this[W]=!0,this._error=null,this._promiseId=0,this._subscribers=[],this._links=u,this._asyncStartAggregateVersion=0,this._asyncRetryCount=0,this._trackEpoch=-1,this._trackLinks=u,this._trackCount=0,this._value=void 0,this.flags=Tt|C|y,this._equal=e.equal??Object.is,this._fn=t,this._defaultValue="defaultValue"in e?e.defaultValue:x,this._onError=e.onError??null;const s=e.maxAsyncRetries;if(this._maxAsyncRetries=s!=null&&s>=0?s:Q.MAX_ASYNC_RETRIES,N.attachDebugInfo(this,"computed",this.id),e.lazy===!1)try{this._recompute()}catch{}}_track(){const t=_.current;t&&st(this,t,this._subscribers)}get value(){this._track();const t=this.flags;if((t&(p|C|y))===p)return this._value;if(t&v)throw new f(c.COMPUTED_DISPOSED);if(t&T){if(this._defaultValue!==x)return this._defaultValue;throw new f(c.COMPUTED_CIRCULAR_DEPENDENCY)}if(t&(C|y)&&(this._recompute(),this.flags&p))return this._value;const e=this._defaultValue,s=e!==x;if(this.flags&k){if(s)return e;throw new f(c.COMPUTED_ASYNC_PENDING_NO_DEFAULT)}if(this.flags&A){if(s)return e;throw this._error}return this._value}peek(){return this._value}get state(){return this._track(),bt(this.flags)}get hasError(){if(this._track(),this.flags&(A|R))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&R)return!0}return!1}get isValid(){return!this.hasError}get errors(){if(this._track(),!this.hasError)return ct;const t=[];this._error&&t.push(this._error);const e=this._links;for(let s=0,n=e.length;s<n;s++){const r=e[s].node;if(r.flags&R){const h=r.errors;if(h.length>0)for(let g=0;g<h.length;g++){const U=h[g];U&&t.indexOf(U)===-1&&t.push(U)}}}return Object.freeze(t)}get lastError(){return this._track(),this._error}get isPending(){return this._track(),(this.flags&k)!==0}get isResolved(){return this._track(),(this.flags&p)!==0}invalidate(){this._markDirty()}dispose(){if(this.flags&v)return;const t=this._links;if(t!==u){for(let e=0,s=t.length;e<s;e++)t[e].unsub?.();d.release(t),this._links=u}this._subscribers.length=0,this.flags=v|C|y,this._error=null,this._value=void 0}[(K=m,W=G,Symbol.dispose)](){this.dispose()}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 M(t,t.version));this._trackCount++}}_recompute(){if(this.flags&T)return;this.flags|=T;const t=this._links;this._trackEpoch=H(),this._trackLinks=d.acquire(),this._trackCount=0;let e=!1;try{const s=_.run(this,this._fn);this._trackLinks.length=this._trackCount,j(this._trackLinks,t,this),this._links=this._trackLinks,e=!0,ot(s)?this._handleAsyncComputation(s):this._finalizeResolution(s)}catch(s){if(!e)try{this._trackLinks.length=this._trackCount,j(this._trackLinks,t,this),this._links=this._trackLinks,e=!0}catch{}this._handleError(s,c.COMPUTED_COMPUTATION_FAILED,!0)}finally{e&&t!==u?d.release(t):e||d.release(this._trackLinks),this._trackEpoch=-1,this._trackLinks=u,this._trackCount=0,this.flags&=~T}}_handleAsyncComputation(t){this.flags=(this.flags|k)&-217,this._notifySubscribers(void 0,void 0),this._asyncStartAggregateVersion=this._captureVersionSnapshot(),this._asyncRetryCount=0,this._promiseId=(this._promiseId+1)%Q.MAX_PROMISE_ID;const e=this._promiseId;t.then(s=>{if(e===this._promiseId){if(this._captureVersionSnapshot()!==this._asyncStartAggregateVersion)return this._asyncRetryCount++<this._maxAsyncRetries?this._markDirty():this._handleError(new f(`Async drift threshold exceeded after ${this._maxAsyncRetries} retries.`),c.COMPUTED_ASYNC_COMPUTATION_FAILED);this._finalizeResolution(s),this._notifySubscribers(s,void 0)}},s=>e===this._promiseId&&this._handleError(s,c.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+e[s].node.version|0;return t}_handleError(t,e,s=!1){const n=D(t,f,e);if(!s&&!(this.flags&A)&&(this.version=w(this.version)),this._error=n,this.flags=this.flags&-121|A|R,this._onError)try{this._onError(n)}catch(r){console.error(c.CALLBACK_ERROR_IN_ERROR_HANDLER,r)}if(s)throw n;this._notifySubscribers(void 0,void 0)}_finalizeResolution(t){(!(this.flags&p)||!this._equal(this._value,t))&&(this.version=w(this.version)),this._value=t,this._error=null,this.flags=(this.flags|p)&-697}execute(){this._markDirty()}_markDirty(){this.flags&(T|C)||(this.flags|=C,this._notifySubscribers(void 0,void 0))}}function Nt(i,t={}){return new At(i,t)}var J;class yt extends it{constructor(t,e={}){super(),this[J]=!0,this._cleanup=null,this._links=u,this._nextLinks=null,this._prevLinks=u,this._currentEpoch=-1,this._lastFlushEpoch=-1,this._executionsInEpoch=0,this._executionCount=0,this._windowStart=0,this._windowCount=0,this._execId=0,this._fn=t,this._onError=e.onError??null,this._sync=e.sync??!1,this._maxExecutions=e.maxExecutionsPerSecond??E.MAX_EXECUTIONS_PER_SECOND,this._maxExecutionsPerFlush=e.maxExecutionsPerFlush??E.MAX_EXECUTIONS_PER_EFFECT,this._sync?(this._executeTask=void 0,this._notifyCallback=()=>this.execute()):(this._executeTask=()=>this.execute(),this._notifyCallback=()=>O.schedule(this._executeTask)),N.attachDebugInfo(this,"effect",this.id)}run(){if(this.flags&l.DISPOSED)throw new I(c.EFFECT_DISPOSED);this.execute(!0)}dispose(){this.flags&l.DISPOSED||(this.flags|=l.DISPOSED,this._execCleanup(),this._unsubLinks(this._links),this._links!==u&&d.release(this._links),this._links=u,this._prevLinks=u)}[(J=X,Symbol.dispose)](){this.dispose()}addDependency(t){if(!(this.flags&l.EXECUTING))return;const e=this._currentEpoch;if(t._lastSeenEpoch===e)return;t._lastSeenEpoch=e;const s=this._nextLinks,n=this._prevLinks;for(let r=0,o=n.length;r<o;r++){const h=n[r];if(h&&h.node===t&&h.unsub){h.version=t.version,s.push(h),n[r]=null;return}}try{const r=t.subscribe(this._notifyCallback);s.push(new M(t,t.version,r))}catch(r){const o=D(r,I,c.EFFECT_EXECUTION_FAILED);if(console.error(o),this._onError)try{this._onError(o)}catch{}s.push(new M(t,t.version,void 0))}}execute(t=!1){if(this.flags&(l.DISPOSED|l.EXECUTING)||!t&&this._links.length>0&&!this._isDirty())return;this._checkInfiniteLoops(),this.flags|=l.EXECUTING,this._execCleanup(),this._prevLinks=this._links;const e=d.acquire();this._nextLinks=e,this._currentEpoch=H();let s=!1;try{const n=_.run(this,this._fn);this._links=e,s=!0,ot(n)?this._handleAsyncResult(n):this._cleanup=typeof n=="function"?n:null}catch(n){this._links=e,s=!0,this._handleExecutionError(n),this._cleanup=null}finally{this._finalizeDependencies(s,this._prevLinks,e),this.flags&=-9}}_handleAsyncResult(t){const e=++this._execId;t.then(s=>{if(e!==this._execId||this.flags&l.DISPOSED){if(typeof s=="function")try{s()}catch(n){this._handleExecutionError(n,c.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,this._prevLinks=u,t){for(let n=0,r=e.length;n<r;n++){const o=e[n];o&&o.unsub?.()}e!==u&&d.release(e)}else this._unsubLinks(s),d.release(s)}_unsubLinks(t){for(let e=0,s=t.length;e<s;e++)t[e]?.unsub?.()}_isDirty(){const t=this._links,e=_.current;_.current=null;try{for(let s=0,n=t.length;s<n;s++){const r=t[s],o=r.node;if(o.flags&Z.IS_COMPUTED)try{o.value}catch{return!0}if(o.version!==r.version)return!0}return!1}finally{_.current=e}}_execCleanup(){if(this._cleanup){try{this._cleanup()}catch(t){this._handleExecutionError(t,c.EFFECT_CLEANUP_FAILED)}this._cleanup=null}}_checkInfiniteLoops(){const t=ft();this._lastFlushEpoch!==t&&(this._lastFlushEpoch=t,this._executionsInEpoch=0),++this._executionsInEpoch>this._maxExecutionsPerFlush&&this._throwInfiniteLoopError("per-effect"),Et()>E.MAX_EXECUTIONS_PER_FLUSH&&this._throwInfiniteLoopError("global"),this._executionCount++}get isDisposed(){return(this.flags&l.DISPOSED)!==0}get executionCount(){return this._executionCount}get isExecuting(){return(this.flags&l.EXECUTING)!==0}_throwInfiniteLoopError(t){const e=new I(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${V}`);throw this.dispose(),console.error(e),e}_handleExecutionError(t,e=c.EFFECT_EXECUTION_FAILED){const s=D(t,I,e);if(console.error(s),this._onError)try{this._onError(s)}catch(n){console.error(D(n,I,c.CALLBACK_ERROR_IN_ERROR_HANDLER))}}}function Rt(i,t={}){if(typeof i!="function")throw new I(c.EFFECT_MUST_BE_FUNCTION);const e=new yt(i,t);return e.execute(),e}function Ft(i){if(typeof i!="function")throw new TypeError("Batch callback must be a function");O.startBatch();try{return i()}finally{O.endBatch()}}exports.ATOM_BRAND=m;exports.AsyncState=b;exports.AtomError=S;exports.COMPUTED_BRAND=G;exports.ComputedError=f;exports.DEBUG_CONFIG=tt;exports.DEBUG_RUNTIME=N;exports.EFFECT_BRAND=X;exports.EffectError=I;exports.POOL_CONFIG=ht;exports.SCHEDULER_CONFIG=E;exports.SchedulerError=F;exports.atom=St;exports.batch=Ft;exports.computed=Nt;exports.effect=Rt;exports.isAtom=Ct;exports.isComputed=Dt;exports.isEffect=Ot;exports.scheduler=O;exports.untracked=pt;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const T={IDLE:"idle",PENDING:"pending",RESOLVED:"resolved",REJECTED:"rejected"},u={DISPOSED:1,EXECUTING:8},K={DISPOSED:1,IS_COMPUTED:2,DIRTY:8,IDLE:16,PENDING:32,RESOLVED:64,REJECTED:128,RECOMPUTING:256,HAS_ERROR:512},a={DISPOSED:1,SYNC:8,NOTIFICATION_SCHEDULED:16},nt={MAX_SIZE:1e3,WARMUP_SIZE:100,ENABLE_STATS:!1},f={MAX_EXECUTIONS_PER_SECOND:1e3,MAX_EXECUTIONS_PER_EFFECT:100,MAX_EXECUTIONS_PER_FLUSH:1e4,MAX_FLUSH_ITERATIONS:1e3,MIN_FLUSH_ITERATIONS:10,BATCH_QUEUE_SHRINK_THRESHOLD:1e3},J={WARN_INFINITE_LOOP:!0,EFFECT_FREQUENCY_WINDOW:1e3},G={MAX_ASYNC_RETRIES:3,MAX_PROMISE_ID:Number.MAX_SAFE_INTEGER-1},m=1073741823,Z=typeof process<"u"&&process.env&&!1||!1,ot=Object.freeze([]);class I extends Error{constructor(t,e=null,s=!0){super(t),this.cause=e,this.recoverable=s,this.name="AtomError"}}class l extends I{constructor(t,e=null){super(t,e,!0),this.name="ComputedError"}}class p extends I{constructor(t,e=null){super(t,e,!1),this.name="EffectError"}}class R extends I{constructor(t,e=null){super(t,e,!1),this.name="SchedulerError"}}const ht=Symbol("AtomEffect.DebugName"),ct=Symbol("AtomEffect.Type"),k=Symbol("AtomEffect.NoDefaultValue"),b={enabled:Z,warnInfiniteLoop:J.WARN_INFINITE_LOOP,warn(i,t){},checkCircular(i,t){if(i===t)throw new l("Direct circular dependency detected")},attachDebugInfo(i,t,e){},getDebugName:i=>i?.[ht],getDebugType:i=>i?.[ct]};let ut=1;const _t=()=>ut++;function tt(i,t,e){if(typeof t=="function"){const r=t;if(e.some(n=>n&&n.fn===r))return;e.push(new M(r,void 0));return}if("addDependency"in t){t.addDependency(i);return}const s=t;e.some(r=>r&&r.sub===s)||e.push(new M(void 0,s))}function X(i,t,e){const s=new Map;t.forEach(r=>{r?.unsub&&s.set(r.node,r.unsub)}),i.forEach(r=>{if(!r)return;const n=r.node,o=s.get(n);o!==void 0?(r.unsub=o,s.delete(n)):(b.checkCircular(n,e),r.unsub=n.subscribe(e))}),s.forEach(r=>r())}class v{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 h={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",SCHEDULER_FLUSH_OVERFLOW:(i,t)=>`Maximum flush iterations (${i}) exceeded. ${t} jobs dropped. Possible infinite loop.`,CALLBACK_ERROR_IN_ERROR_HANDLER:"Exception encountered in onError handler",EFFECT_FREQUENCY_LIMIT_EXCEEDED:"Effect executed too frequently within 1 second. Suspected infinite loop.",SCHEDULER_CALLBACK_MUST_BE_FUNCTION:"Scheduler callback must be a function",SCHEDULER_END_BATCH_WITHOUT_START:"endBatch() called without matching startBatch(). Ignoring."};function C(i,t,e){if(i instanceof I)return i;const s=i instanceof Error,r=s?i.message:String(i),n=s?i:void 0,A=`${s?i.constructor.name:"Unexpected error"} (${e}): ${r}`;return new t(A,n)}class et{constructor(){this.flags=0,this.version=0,this._lastSeenEpoch=-1,this.id=_t()&m}}class st extends et{subscribe(t){const e=typeof t=="function";if(!e&&(!t||typeof t.execute!="function"))throw C(new TypeError("Invalid subscriber"),I,h.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);if(this._subscribers.some(n=>n?e?n.fn===t:n.sub===t:!1))return()=>{};const s=new M(e?t:void 0,e?void 0:t);return this._subscribers.push(s),()=>this._unsubscribe(s)}_unsubscribe(t){const e=this._subscribers,s=e.indexOf(t);if(s===-1)return;const r=e.pop();s<e.length&&r&&(e[s]=r)}subscriberCount(){return this._subscribers.length}_notifySubscribers(t,e){if(this._subscribers.length===0)return;this._subscribers.slice(0).forEach(r=>{if(r)try{r.fn?r.fn(t,e):r.sub&&r.sub.execute()}catch(n){this._handleNotifyError(n)}})}_handleNotifyError(t){console.error(C(t,I,h.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED))}}let x=0;const w=()=>(x=x+1&m||1,x),B=i=>i+1&m;let z=0,F=!1,it=0;const at=()=>it;function Q(){return F?!1:(F=!0,it=w(),z=0,!0)}const Y=()=>{F=!1},lt=()=>F?++z:0;class ft{constructor(){this._queueBuffer=[[],[]],this._bufferIndex=0,this._size=0,this._epoch=0,this._isProcessing=!1,this._isBatching=!1,this._isFlushingSync=!1,this._batchDepth=0,this._batchQueue=[],this._batchQueueSize=0,this._maxFlushIterations=f.MAX_FLUSH_ITERATIONS,this.onOverflow=null,this._boundRunLoop=this._runLoop.bind(this)}get phase(){return this._isProcessing||this._isFlushingSync?2:this._isBatching?1:0}get queueSize(){return this._size}get isBatching(){return this._isBatching}schedule(t){if(t._nextEpoch!==this._epoch){if(t._nextEpoch=this._epoch,this._isBatching||this._isFlushingSync){this._batchQueue[this._batchQueueSize++]=t;return}this._queueBuffer[this._bufferIndex][this._size++]=t,this._isProcessing||this._flush()}}_flush(){this._isProcessing||this._size===0||(this._isProcessing=!0,queueMicrotask(this._boundRunLoop))}_runLoop(){try{if(this._size===0)return;const t=Q();this._drainQueue(),t&&Y()}finally{this._isProcessing=!1,this._size>0&&!this._isBatching&&this._flush()}}_flushSync(){this._isFlushingSync=!0;const t=Q();try{this._mergeBatchQueue(),this._drainQueue()}finally{this._isFlushingSync=!1,t&&Y()}}_mergeBatchQueue(){if(this._batchQueueSize===0)return;const t=++this._epoch,e=this._batchQueue,s=this._queueBuffer[this._bufferIndex];let r=this._size;e.slice(0,this._batchQueueSize).forEach(n=>{n._nextEpoch!==t&&(n._nextEpoch=t,s[r++]=n)}),this._size=r,this._batchQueueSize=0,e.length>f.BATCH_QUEUE_SHRINK_THRESHOLD&&(e.length=0)}_drainQueue(){let t=0;for(;this._size>0;){if(++t>this._maxFlushIterations){this._handleFlushOverflow();return}this._processQueue(),this._mergeBatchQueue()}}_processQueue(){const t=this._bufferIndex,e=this._queueBuffer[t],s=this._size;this._bufferIndex=t^1,this._size=0,this._epoch++;for(let r=0;r<s;r++)try{e[r]()}catch(n){console.error(new R("Error occurred during scheduler execution",n))}e.length=0}_handleFlushOverflow(){const t=this._size+this._batchQueueSize;if(console.error(new R(h.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations,t))),this._size=0,this._queueBuffer[this._bufferIndex].length=0,this._batchQueueSize=0,this.onOverflow)try{this.onOverflow(t)}catch{}}startBatch(){this._batchDepth++,this._isBatching=!0}endBatch(){this._batchDepth!==0&&--this._batchDepth===0&&(this._flushSync(),this._isBatching=!1)}setMaxFlushIterations(t){if(t<f.MIN_FLUSH_ITERATIONS)throw new R(`Max flush iterations must be at least ${f.MIN_FLUSH_ITERATIONS}`);this._maxFlushIterations=t}}const D=new ft,U=Symbol.for("atom-effect/atom"),H=Symbol.for("atom-effect/computed"),V=Symbol.for("atom-effect/effect"),_={current:null,run(i,t){const e=this.current;this.current=i;try{return t()}finally{this.current=e}}};function Et(i){const t=_.current;if(t===null)return i();_.current=null;try{return i()}finally{_.current=t}}var q;class dt extends st{constructor(t,e){super(),this._pendingOldValue=void 0,this._notifyTask=()=>this._flushNotifications(),this._subscribers=[],this[q]=!0,this._value=t,e&&(this.flags|=a.SYNC),b.attachDebugInfo(this,"atom",this.id)}get value(){const t=_.current;return t&&tt(this,t,this._subscribers),this._value}set value(t){const e=this._value;if(Object.is(e,t))return;this._value=t,this.version=B(this.version);const s=this.flags;if(!(this._subscribers.length===0||s&a.NOTIFICATION_SCHEDULED)){if(this._pendingOldValue=e,this.flags=s|a.NOTIFICATION_SCHEDULED,s&a.SYNC&&!D.isBatching){this._flushNotifications();return}D.schedule(this._notifyTask)}}_flushNotifications(){const t=this.flags;if(!(t&a.NOTIFICATION_SCHEDULED)||t&a.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&a.DISPOSED||(this._subscribers.length=0,this.flags|=a.DISPOSED,this._value=void 0,this._pendingOldValue=void 0)}[(q=U,Symbol.dispose)](){this.dispose()}}function pt(i,t={}){return new dt(i,t.sync??!1)}class It{constructor(t=50,e=256,s=!1){this.limit=t,this.capacity=e,this.pool=[],this.stats=null,this.stats=s?{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,r=t-e-(s.frozen+s.tooLarge+s.poolFull);return{acquired:t,released:e,rejected:{...s},leaked:r,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 c=Object.freeze([]),E=new It;function St(i){return i!==null&&typeof i=="object"&&U in i}function Ct(i){return i!==null&&typeof i=="object"&&H in i}function Dt(i){return i!==null&&typeof i=="object"&&V in i}function rt(i){return i!==null&&typeof i=="object"&&typeof i.then=="function"}var j,$;const{IDLE:N,DIRTY:S,PENDING:L,RESOLVED:d,REJECTED:O,HAS_ERROR:y,RECOMPUTING:g,DISPOSED:P,IS_COMPUTED:gt}=K;function Tt(i){return i&d?T.RESOLVED:i&L?T.PENDING:i&O?T.REJECTED:T.IDLE}class Ot extends st{constructor(t,e={}){if(typeof t!="function")throw new l(h.COMPUTED_MUST_BE_FUNCTION);super(),this[$]=!0,this[j]=!0,this._error=null,this._promiseId=0,this._subscribers=[],this._links=c,this._asyncStartAggregateVersion=0,this._asyncRetryCount=0,this._trackEpoch=-1,this._trackLinks=c,this._trackCount=0,this._value=void 0,this.flags=gt|S|N,this._equal=e.equal??Object.is,this._fn=t,this._defaultValue="defaultValue"in e?e.defaultValue:k,this._onError=e.onError??null;const s=e.maxAsyncRetries;if(this._maxAsyncRetries=(s??G.MAX_ASYNC_RETRIES)&m,b.attachDebugInfo(this,"computed",this.id),e.lazy===!1)try{this._recompute()}catch{}}_track(){const t=_.current;t&&tt(this,t,this._subscribers)}get value(){this._track();const t=this.flags;if((t&(d|S|N))===d)return this._value;if(t&P)throw new l(h.COMPUTED_DISPOSED);if(t&g){if(this._defaultValue!==k)return this._defaultValue;throw new l(h.COMPUTED_CIRCULAR_DEPENDENCY)}if(t&(S|N)&&(this._recompute(),this.flags&d))return this._value;const e=this._defaultValue,s=e!==k;if(this.flags&L){if(s)return e;throw new l(h.COMPUTED_ASYNC_PENDING_NO_DEFAULT)}if(this.flags&O){if(s)return e;throw this._error}return this._value}peek(){return this._value}get state(){return this._track(),Tt(this.flags)}get hasError(){return this._track(),this.flags&(O|y)?!0:this._links.some(t=>t?.node?.flags&y)}get isValid(){return!this.hasError}get errors(){if(this._track(),!this.hasError)return ot;const t=[];return this._error&&t.push(this._error),this._links.forEach(s=>{const r=s.node;r.flags&y&&r.errors.forEach(o=>{o&&!t.includes(o)&&t.push(o)})}),Object.freeze(t)}get lastError(){return this._track(),this._error}get isPending(){return this._track(),(this.flags&L)!==0}get isResolved(){return this._track(),(this.flags&d)!==0}invalidate(){this._markDirty()}dispose(){if(this.flags&P)return;const t=this._links;t!==c&&(t.forEach(e=>e.unsub?.()),E.release(t),this._links=c),this._subscribers.length=0,this.flags=P|S|N,this._error=null,this._value=void 0}[($=U,j=H,Symbol.dispose)](){this.dispose()}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 v(t,t.version));this._trackCount++}}_recompute(){if(this.flags&g)return;this.flags|=g;const t=this._links;this._trackEpoch=w(),this._trackLinks=E.acquire(),this._trackCount=0;let e=!1;try{const s=_.run(this,this._fn);this._trackLinks.length=this._trackCount,X(this._trackLinks,t,this),this._links=this._trackLinks,e=!0,rt(s)?this._handleAsyncComputation(s):this._finalizeResolution(s)}catch(s){if(!e)try{this._trackLinks.length=this._trackCount,X(this._trackLinks,t,this),this._links=this._trackLinks,e=!0}catch{}this._handleError(s,h.COMPUTED_COMPUTATION_FAILED,!0)}finally{e&&t!==c?E.release(t):e||E.release(this._trackLinks),this._trackEpoch=-1,this._trackLinks=c,this._trackCount=0,this.flags&=~g}}_handleAsyncComputation(t){this.flags=(this.flags|L)&-217,this._notifySubscribers(void 0,void 0),this._asyncStartAggregateVersion=this._captureVersionSnapshot(),this._asyncRetryCount=0,this._promiseId=(this._promiseId+1)%G.MAX_PROMISE_ID;const e=this._promiseId;t.then(s=>{if(e===this._promiseId){if(this._captureVersionSnapshot()!==this._asyncStartAggregateVersion)return this._asyncRetryCount++<this._maxAsyncRetries?this._markDirty():this._handleError(new l(`Async drift threshold exceeded after ${this._maxAsyncRetries} retries.`),h.COMPUTED_ASYNC_COMPUTATION_FAILED);this._finalizeResolution(s),this._notifySubscribers(s,void 0)}},s=>e===this._promiseId&&this._handleError(s,h.COMPUTED_ASYNC_COMPUTATION_FAILED))}_captureVersionSnapshot(){let t=0;const e=this._links;for(let s=0,r=e.length;s<r;s++)t=(t<<5)-t+e[s].node.version|0;return t}_handleError(t,e,s=!1){const r=C(t,l,e);if(!s&&!(this.flags&O)&&(this.version=B(this.version)),this._error=r,this.flags=this.flags&-121|O|y,this._onError)try{this._onError(r)}catch(n){console.error(h.CALLBACK_ERROR_IN_ERROR_HANDLER,n)}if(s)throw r;this._notifySubscribers(void 0,void 0)}_finalizeResolution(t){(!(this.flags&d)||!this._equal(this._value,t))&&(this.version=B(this.version)),this._value=t,this._error=null,this.flags=(this.flags|d)&-697}execute(){this._markDirty()}_markDirty(){this.flags&(g|S)||(this.flags|=S,this._notifySubscribers(void 0,void 0))}}function bt(i,t={}){return new Ot(i,t)}var W;class At extends et{constructor(t,e={}){super(),this[W]=!0,this._cleanup=null,this._links=c,this._nextLinks=null,this._prevLinks=c,this._currentEpoch=-1,this._lastFlushEpoch=-1,this._executionsInEpoch=0,this._executionCount=0,this._windowStart=0,this._windowCount=0,this._execId=0,this._fn=t,this._onError=e.onError??null,this._sync=e.sync??!1,this._maxExecutions=e.maxExecutionsPerSecond??f.MAX_EXECUTIONS_PER_SECOND,this._maxExecutionsPerFlush=e.maxExecutionsPerFlush??f.MAX_EXECUTIONS_PER_EFFECT,this._sync?(this._executeTask=void 0,this._notifyCallback=()=>this.execute()):(this._executeTask=()=>this.execute(),this._notifyCallback=()=>D.schedule(this._executeTask)),b.attachDebugInfo(this,"effect",this.id)}run(){if(this.flags&u.DISPOSED)throw new p(h.EFFECT_DISPOSED);this.execute(!0)}dispose(){this.flags&u.DISPOSED||(this.flags|=u.DISPOSED,this._execCleanup(),this._unsubLinks(this._links),this._links!==c&&E.release(this._links),this._links=c,this._prevLinks=c)}[(W=V,Symbol.dispose)](){this.dispose()}addDependency(t){if(!(this.flags&u.EXECUTING))return;const e=this._currentEpoch;if(t._lastSeenEpoch===e)return;t._lastSeenEpoch=e;const s=this._nextLinks,r=this._prevLinks,n=r.findIndex(o=>o&&o.node===t&&o.unsub);if(n!==-1){const o=r[n];o.version=t.version,s.push(o),r[n]=null;return}try{const o=t.subscribe(this._notifyCallback);s.push(new v(t,t.version,o))}catch(o){const A=C(o,p,h.EFFECT_EXECUTION_FAILED);if(console.error(A),this._onError)try{this._onError(A)}catch{}s.push(new v(t,t.version,void 0))}}execute(t=!1){if(this.flags&(u.DISPOSED|u.EXECUTING)||!t&&this._links.length>0&&!this._isDirty())return;this._checkInfiniteLoops(),this.flags|=u.EXECUTING,this._execCleanup(),this._prevLinks=this._links;const e=E.acquire();this._nextLinks=e,this._currentEpoch=w();let s=!1;try{const r=_.run(this,this._fn);this._links=e,s=!0,rt(r)?this._handleAsyncResult(r):this._cleanup=typeof r=="function"?r:null}catch(r){this._links=e,s=!0,this._handleExecutionError(r),this._cleanup=null}finally{this._finalizeDependencies(s,this._prevLinks,e),this.flags&=-9}}_handleAsyncResult(t){const e=++this._execId;t.then(s=>{if(e!==this._execId||this.flags&u.DISPOSED){if(typeof s=="function")try{s()}catch(r){this._handleExecutionError(r,h.EFFECT_CLEANUP_FAILED)}return}typeof s=="function"&&(this._cleanup=s)},s=>e===this._execId&&this._handleExecutionError(s))}_finalizeDependencies(t,e,s){this._nextLinks=null,this._prevLinks=c,t?(e.forEach(r=>r?.unsub?.()),e!==c&&E.release(e)):(this._unsubLinks(s),E.release(s))}_unsubLinks(t){t.forEach(e=>e?.unsub?.())}_isDirty(){const t=this._links,e=_.current;_.current=null;try{return t.some(s=>{const r=s.node;if(r.flags&K.IS_COMPUTED)try{r.value}catch{return!0}return r.version!==s.version})}finally{_.current=e}}_execCleanup(){if(this._cleanup){try{this._cleanup()}catch(t){this._handleExecutionError(t,h.EFFECT_CLEANUP_FAILED)}this._cleanup=null}}_checkInfiniteLoops(){const t=at();this._lastFlushEpoch!==t&&(this._lastFlushEpoch=t,this._executionsInEpoch=0),++this._executionsInEpoch>this._maxExecutionsPerFlush&&this._throwInfiniteLoopError("per-effect"),lt()>f.MAX_EXECUTIONS_PER_FLUSH&&this._throwInfiniteLoopError("global"),this._executionCount++}get isDisposed(){return(this.flags&u.DISPOSED)!==0}get executionCount(){return this._executionCount}get isExecuting(){return(this.flags&u.EXECUTING)!==0}_throwInfiniteLoopError(t){const e=new p(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${z}`);throw this.dispose(),console.error(e),e}_handleExecutionError(t,e=h.EFFECT_EXECUTION_FAILED){const s=C(t,p,e);if(console.error(s),this._onError)try{this._onError(s)}catch(r){console.error(C(r,p,h.CALLBACK_ERROR_IN_ERROR_HANDLER))}}}function Nt(i,t={}){if(typeof i!="function")throw new p(h.EFFECT_MUST_BE_FUNCTION);const e=new At(i,t);return e.execute(),e}function yt(i){if(typeof i!="function")throw new TypeError("Batch callback must be a function");D.startBatch();try{return i()}finally{D.endBatch()}}exports.ATOM_BRAND=U;exports.AsyncState=T;exports.AtomError=I;exports.COMPUTED_BRAND=H;exports.ComputedError=l;exports.DEBUG_CONFIG=J;exports.DEBUG_RUNTIME=b;exports.EFFECT_BRAND=V;exports.EffectError=p;exports.POOL_CONFIG=nt;exports.SCHEDULER_CONFIG=f;exports.SchedulerError=R;exports.atom=pt;exports.batch=yt;exports.computed=bt;exports.effect=Nt;exports.isAtom=St;exports.isComputed=Ct;exports.isEffect=Dt;exports.scheduler=D;exports.untracked=Et;
2
2
  //# sourceMappingURL=index.cjs.map