@but212/atom-effect 0.26.0 → 0.27.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 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/constants.ts","../src/core/dep-tracking.ts","../src/errors/errors.ts","../src/errors/messages.ts","../src/internal/slot-buffer.ts","../src/utils/debug.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/internal/dep-slot-buffer.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 /** Flagged when explicitly invalidated. Bypasses fast-path dirty checks. */\n FORCE_COMPUTE: 1 << 10,\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 * 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 * Epoch sentinel values.\n */\nexport const EPOCH_CONSTANTS = {\n /** Uninitialized epoch marker. Used as initial value before any flush has occurred. */\n UNINITIALIZED: -1,\n /** Minimum valid epoch value after a counter reset. */\n MIN: 1,\n} as const;\n\n/**\n * V8 Small Integer (SMI) max value.\n */\nexport const SMI_MAX = 0x3fffffff;\n\n/**\n * Bit-packing constants for versioned slot operations.\n * Used by DepSlotBuffer for O(1) snapshot hashing.\n */\nexport const BITPACK = {\n /** Bits allocated for version in a packed slot value. */\n VERSION_BITS: 16,\n} as const;\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","import type { Dependency, Subscriber } from '@/types';\n// trackDependency removed as it was obsolete and caused polymorphic cache misses\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 notify(newValue?: T, oldValue?: T): void {\n if (this.fn) this.fn(newValue, oldValue);\n else if (this.sub) this.sub.execute();\n }\n}\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","/**\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 BATCH_CALLBACK_MUST_BE_FUNCTION: 'Batch callback must be a function',\n} as const;\n","/**\n * Inline-slot subscriber container.\n *\n * Stores up to 4 items directly as object properties\n * (zero array allocation). Spills to an overflow array only when the\n * inline slots are exhausted.\n *\n * Design goals:\n * - **Cache locality**: hot-path data lives on the same V8 object.\n * - **Logical deletion**: `remove()` nulls a slot and decrements `_count`.\n * Physical compaction is deferred to `compact()`.\n * - **O(1) overflow reuse**: free-index stack avoids linear gap scan.\n *\n * @template T - Slot element type (e.g. `Subscription<V>`).\n */\nexport class SlotBuffer<T> {\n // ── Inline slots ──────────────────────────────────────────────────────\n // Always declared to lock V8 hidden class shape.\n _s0: T | null = null;\n _s1: T | null = null;\n _s2: T | null = null;\n _s3: T | null = null;\n\n // ── Bookkeeping ───────────────────────────────────────────────────────\n /** Active (non-null) element count across slots + overflow. */\n _count = 0;\n\n /** Lazy-allocated overflow array for subscribers beyond inline capacity. */\n _overflow: (T | null)[] | null = null;\n\n /** Free overflow indices for O(1) gap reuse (lazy-allocated). */\n _freeIndices: number[] | null = null;\n\n // ── Public API ────────────────────────────────────────────────────────\n\n /** Number of active (non-null) elements. */\n get size(): number {\n return this._count;\n }\n\n /** Gets the item at a specific logical index. */\n getAt(index: number): T | null {\n switch (index) {\n case 0:\n return this._s0;\n case 1:\n return this._s1;\n case 2:\n return this._s2;\n case 3:\n return this._s3;\n default: {\n const ov = this._overflow;\n if (ov !== null && index >= 4) {\n const ovIdx = index - 4;\n if (ovIdx < ov.length) return ov[ovIdx] ?? null;\n }\n return null;\n }\n }\n }\n\n /** Overwrites an item at a specific index. */\n setAt(index: number, item: T | null): void {\n switch (index) {\n case 0:\n this._s0 = item;\n break;\n case 1:\n this._s1 = item;\n break;\n case 2:\n this._s2 = item;\n break;\n case 3:\n this._s3 = item;\n break;\n default: {\n this._overflow ??= [];\n const ov = this._overflow;\n ov[index - 4] = item;\n }\n }\n\n if (index >= this._count) {\n this._count = index + 1;\n }\n }\n\n /**\n * Discards all items from the given index onwards.\n * Equivalent to resetting the length of an array.\n */\n truncateFrom(index: number): void {\n const count = this._count;\n if (index >= count) return;\n\n // 1. Unroll Inline Slots Cleanup\n // Uses fallthrough logic to clean up all slots from the given index onwards.\n if (index <= 3) {\n switch (index) {\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for range cleanup\n case 0: {\n const s = this._s0;\n if (s != null) {\n this._onItemRemoved(s);\n this._s0 = null;\n }\n }\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for range cleanup\n case 1: {\n const s = this._s1;\n if (s != null) {\n this._onItemRemoved(s);\n this._s1 = null;\n }\n }\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for range cleanup\n case 2: {\n const s = this._s2;\n if (s != null) {\n this._onItemRemoved(s);\n this._s2 = null;\n }\n }\n case 3: {\n const s = this._s3;\n if (s != null) {\n this._onItemRemoved(s);\n this._s3 = null;\n }\n }\n }\n }\n\n // 2. Overflow Cleanup\n const ov = this._overflow;\n if (ov !== null && count > 4) {\n const startIdx = index > 4 ? index - 4 : 0;\n const len = ov.length;\n for (let i = startIdx; i < len; i++) {\n const item = ov[i];\n if (item != null) {\n this._onItemRemoved(item);\n ov[i] = null;\n }\n }\n\n if (index <= 4) {\n ov.length = 0;\n this._overflow = null;\n } else {\n ov.length = index - 4;\n }\n }\n\n // 3. Invalidate free indices (they may point to truncated positions)\n if (this._freeIndices !== null) {\n this._freeIndices = null;\n }\n\n this._count = index;\n }\n\n /**\n * Protected hook called whenever an item is logically removed from the buffer.\n * Allows subclasses (like DepSlotBuffer) to perform cleanup (unsubscribing)\n * without allocating temporary closures in hot paths.\n */\n protected _onItemRemoved(_item: T): void {\n // Base implementation does nothing\n }\n\n /**\n * Adds an item.\n *\n * Prefers filling a null inline slot (including previously-cleared ones)\n * before spilling to the overflow array. Uses O(1) free-index stack\n * for overflow gap reuse.\n */\n add(item: T): void {\n // Fast path: fill inline slots first\n if (this._s0 === null) {\n this._s0 = item;\n this._count++;\n return;\n }\n if (this._s1 === null) {\n this._s1 = item;\n this._count++;\n return;\n }\n if (this._s2 === null) {\n this._s2 = item;\n this._count++;\n return;\n }\n if (this._s3 === null) {\n this._s3 = item;\n this._count++;\n return;\n }\n\n // Overflow path with O(1) free-index reuse\n this._addToOverflow(item);\n }\n\n /**\n * Internal helper to add an item directly to the overflow array,\n * bypassing inline slot checks. Used by DepSlotBuffer for relocation.\n *\n * @internal\n */\n protected _addToOverflow(item: T): void {\n if (this._overflow === null) {\n this._overflow = [item];\n } else {\n const free = this._freeIndices;\n if (free !== null && free.length > 0) {\n this._overflow[free.pop()!] = item;\n } else {\n this._overflow.push(item);\n }\n }\n this._count++;\n }\n\n /**\n * Removes the first occurrence of {@link item} via identity comparison.\n *\n * The slot is nulled out (logical deletion). Call {@link compact}\n * after notification traversal to reclaim the gaps.\n *\n * @returns `true` if the item was found and removed.\n */\n remove(item: T): boolean {\n if (this._s0 === item) {\n this._s0 = null;\n this._count--;\n return true;\n }\n if (this._s1 === item) {\n this._s1 = null;\n this._count--;\n return true;\n }\n if (this._s2 === item) {\n this._s2 = null;\n this._count--;\n return true;\n }\n if (this._s3 === item) {\n this._s3 = null;\n this._count--;\n return true;\n }\n\n const ov = this._overflow;\n if (ov == null) return false;\n\n for (let i = 0, len = ov.length; i < len; i++) {\n if (ov[i] === item) {\n ov[i] = null;\n this._count--;\n // Track freed index for O(1) reuse\n if (this._freeIndices === null) this._freeIndices = [];\n this._freeIndices.push(i);\n return true;\n }\n }\n return false;\n }\n\n /**\n * Checks whether {@link item} exists in the buffer (identity comparison).\n */\n has(item: T): boolean {\n if (this._count === 0) return false;\n\n // 1. Inline Slots\n if (this._s0 === item || this._s1 === item || this._s2 === item || this._s3 === item) {\n return true;\n }\n\n // 2. Overflow Scan\n const ov = this._overflow;\n if (ov != null) {\n for (let i = 0, len = ov.length; i < len; i++) {\n if (ov[i] === item) return true;\n }\n }\n return false;\n }\n\n /**\n * Iterates over all non-null elements.\n *\n * Safe to call during notification — newly-added or removed items\n * during iteration follow the same snapshot semantics as the old\n * array-based approach (length captured upfront for overflow).\n */\n forEach(fn: (item: T) => void): void {\n if (this._count === 0) return;\n\n // 1. Inline slots\n const s0 = this._s0;\n if (s0 != null) fn(s0);\n const s1 = this._s1;\n if (s1 != null) fn(s1);\n const s2 = this._s2;\n if (s2 != null) fn(s2);\n const s3 = this._s3;\n if (s3 != null) fn(s3);\n\n // 2. Overflow\n const ov = this._overflow;\n if (ov != null) {\n for (let i = 0, len = ov.length; i < len; i++) {\n const el = ov[i];\n if (el != null) fn(el);\n }\n }\n }\n\n /**\n * Iterates with index-based access for length-captured traversal.\n *\n * Returns the total number of slots to iterate (inline + overflow).\n * Used by `_notifySubscribers` for length-captured iteration.\n */\n forEachIndexed(fn: (item: T) => void): number {\n const count = this._count;\n if (count === 0) return 0;\n\n // 1. Inline slots\n let executed = 0;\n const s0 = this._s0;\n if (s0 != null) {\n fn(s0);\n executed++;\n }\n const s1 = this._s1;\n if (s1 != null) {\n fn(s1);\n executed++;\n }\n const s2 = this._s2;\n if (s2 != null) {\n fn(s2);\n executed++;\n }\n const s3 = this._s3;\n if (s3 != null) {\n fn(s3);\n executed++;\n }\n\n // Fast exit\n if (executed === count) return executed;\n\n // 2. Overflow\n const ov = this._overflow;\n if (ov != null) {\n for (let i = 0, len = ov.length; i < len; i++) {\n const el = ov[i];\n if (el != null) {\n fn(el);\n executed++;\n }\n }\n }\n return executed;\n }\n\n /**\n * Compacts the overflow array by removing null gaps.\n *\n * Inline slots are not compacted — they stay null until reused by\n * `add()`. This keeps the V8 hidden class stable.\n */\n compact(): void {\n const ov = this._overflow;\n if (ov === null || ov.length === 0) return;\n\n // Pop-and-swap compaction with proper null handling\n let i = 0;\n while (i < ov.length) {\n if (ov[i] === null) {\n // Pop trailing nulls first to find a valid swap candidate\n while (ov.length > i && ov[ov.length - 1] === null) {\n ov.pop();\n }\n // If there's still a valid element beyond i, swap it in\n if (ov.length > i) {\n ov[i] = ov.pop()!;\n i++;\n }\n } else {\n i++;\n }\n }\n\n // Invalidate free indices after compaction (positions have shifted)\n this._freeIndices = null;\n\n // Release overflow array when empty\n if (ov.length === 0) {\n this._overflow = null;\n }\n }\n\n /**\n * Clears the buffer and releases all item references for GC.\n */\n clear(): void {\n this._s0 = null;\n this._s1 = null;\n this._s2 = null;\n this._s3 = null;\n this._count = 0;\n\n if (this._overflow !== null) {\n this._overflow.length = 0;\n this._overflow = null;\n }\n this._freeIndices = null;\n }\n\n /**\n * Hard dispose — releases all references for GC.\n */\n dispose(): void {\n this.clear();\n }\n}\n","import { DEBUG_CONFIG, IS_DEV } from '@/constants';\nimport type { DebugConfig, 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 * 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 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 { 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 { EPOCH_CONSTANTS, 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 { DepSlotBuffer } from '@/internal/dep-slot-buffer';\nimport { SlotBuffer } from '@/internal/slot-buffer';\nimport type { DependencyId, Subscriber } from '@/types';\nimport { generateId } from '@/utils/debug';\nimport { wrapError } from '@/utils/error';\n\n/**\n * Unified base class for all reactive nodes (Atoms, Computeds, Effects).\n *\n * Optimized for V8 Hidden Class Monomorphism by having a single, consistent\n * object shape for all reactive logic.\n *\n * @template T - The type of value produced by this node (used for subscriptions).\n */\nexport abstract class ReactiveNode<T> {\n /** [Producer/Consumer] State flags */\n flags: number;\n /** [Producer/Consumer] Version counter */\n version: number;\n /** [Producer/Consumer] Last access epoch */\n _lastSeenEpoch: number;\n /** [Context] Scheduler epoch tag */\n _nextEpoch?: number;\n /** [Debug] Unique ID for identify node in tracking maps */\n readonly id: DependencyId;\n\n /**\n * [Producer] Managed subscribers.\n */\n _slots: SlotBuffer<Subscription<T>> | null;\n\n /** [Producer] Re-entry guard for notification loop. */\n _notifying: number;\n\n /**\n * [Consumer] Managed dependencies.\n */\n _deps: DepSlotBuffer | null;\n /** [Consumer] O(1) Hot-path dependency index for rapid dirty checks. */\n _hotIndex: number;\n\n constructor() {\n this.flags = 0;\n this.version = 0;\n this._lastSeenEpoch = EPOCH_CONSTANTS.UNINITIALIZED;\n this._notifying = 0;\n this._hotIndex = -1;\n this._slots = null;\n this._deps = null;\n this.id = generateId() & SMI_MAX;\n }\n\n // ============================================================================\n // Producer Logic (Subscriber Management)\n // ============================================================================\n\n /**\n * Adds subscriber for notifications.\n */\n subscribe(listener: ((newValue?: T, oldValue?: T) => void) | Subscriber): () => void {\n const isFn = typeof listener === 'function';\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 let slots = this._slots;\n if (!slots) {\n slots = new SlotBuffer<Subscription<T>>();\n this._slots = slots;\n }\n\n // Duplicate check\n let duplicate = false;\n slots.forEach((sub) => {\n if (isFn ? sub.fn === listener : sub.sub === listener) {\n duplicate = true;\n }\n });\n\n if (duplicate) {\n if (IS_DEV) console.warn(`[atom-effect] Duplicate subscription ignored on node ${this.id}`);\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 slots.add(link);\n return () => this._unsubscribe(link);\n }\n\n protected _unsubscribe(link: Subscription<T>): void {\n if (!this._slots) return;\n\n if (this._notifying > 0) {\n this._slots.remove(link);\n return;\n }\n\n this._slots.remove(link);\n this._slots.compact();\n }\n\n /**\n * Returns current subscriber count.\n */\n subscriberCount(): number {\n return this._slots ? this._slots.size : 0;\n }\n\n /**\n * Notifies all subscribers about a value update.\n */\n protected _notifySubscribers(newValue: T | undefined, oldValue: T | undefined): void {\n const slots = this._slots;\n if (!slots || slots.size === 0) return;\n\n this._notifying++;\n try {\n slots.forEach((s) => {\n try {\n s.notify(newValue, oldValue);\n } catch (err) {\n console.error(\n wrapError(err, AtomError, ERROR_MESSAGES.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED)\n );\n }\n });\n } finally {\n this._notifying--;\n if (this._notifying === 0) {\n slots.compact();\n }\n }\n }\n\n // ============================================================================\n // Consumer Logic (Dependency Validation)\n // ============================================================================\n\n /**\n * Determines if the node is dirty by checking its dependency chain.\n * Optimized with O(1) hot-path check.\n */\n protected _isDirty(): boolean {\n const deps = this._deps;\n if (!deps || deps.size === 0) return false;\n\n // Phase 1: Hot-path Check - O(1)\n if (this._hotIndex !== -1) {\n const hotLink = deps.getAt(this._hotIndex);\n if (hotLink != null && hotLink.node.version !== hotLink.version) {\n return true;\n }\n }\n\n // Phase 2: Standard Validation - O(N)\n if (!deps.hasComputeds && !deps.isDirtyFast()) return false;\n\n // Deep check for computeds\n return this._deepDirtyCheck();\n }\n\n /**\n * Deeply validates dependency versions.\n */\n protected abstract _deepDirtyCheck(): boolean;\n}\n","import { IS_DEV, SCHEDULER_CONFIG, 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. Avoids 0 to reserve it for uninitialized state. */\nexport const nextVersion = (v: number) => (v + 1) & SMI_MAX || 1;\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 * Runs a function within a flush scope.\n * Ensures endFlush() is called even if an error occurs.\n */\nexport function runInFlushScope<T>(fn: () => T): T | undefined {\n if (!startFlush()) return undefined;\n try {\n return fn();\n } finally {\n endFlush();\n }\n}\n\n/**\n * Increments execution count.\n * Throws an error if the count exceeds MAX_EXECUTIONS_PER_FLUSH.\n */\nexport const incrementFlushExecutionCount = () => {\n if (!isFlushing) return 0;\n const count = ++flushExecutionCount;\n if (count > SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_FLUSH) {\n throw new Error(\n `[atom-effect] Infinite loop detected: flush execution count exceeded ${SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_FLUSH}`\n );\n }\n return count;\n};\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 SchedulerJobObject {\n execute(): void;\n /** Next scheduled epoch */\n _nextEpoch?: number;\n}\n\nexport interface SchedulerJobFunction {\n (): void;\n /** Next scheduled epoch */\n _nextEpoch?: number;\n}\n\nexport type SchedulerJob = SchedulerJobFunction | SchedulerJobObject;\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) {\n const isFn = typeof callback === 'function';\n const isObj =\n typeof callback === 'object' &&\n callback !== null &&\n typeof (callback as SchedulerJobObject).execute === 'function';\n if (!isFn && !isObj) {\n throw new SchedulerError(ERROR_MESSAGES.SCHEDULER_CALLBACK_MUST_BE_FUNCTION);\n }\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 using a simple for-loop to avoid slice() allocation and forEach() overhead\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 // Hard reset length to 0 to release references for GC immediately.\n // In V8, this is an O(1) operation that keeps the capacity if the array is small,\n // or reclaims it if it exceeds a threshold.\n bQueue.length = 0;\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 const job = jobs[i]!;\n if (typeof job === 'function') job();\n else job.execute();\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\n/**\n * Positive writable brand — only stamped on truly mutable atoms.\n * Allows future ReadonlyAtom / derived primitives to carry ATOM_BRAND\n * without being misidentified as writable by isWritable().\n */\nexport const WRITABLE_BRAND: unique symbol = Symbol.for('atom-effect/writable');\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 { ReactiveNode } from '@/core/base';\nimport { nextVersion } from '@/internal/epoch';\nimport { scheduler } from '@/internal/scheduler';\nimport { ATOM_BRAND, WRITABLE_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 ReactiveNode<T> implements WritableAtom<T> {\n private _value: T;\n /** Old value for notifications */\n private _pendingOldValue: T | undefined;\n\n /** @internal */\n readonly [ATOM_BRAND] = true;\n /** @internal */\n readonly [WRITABLE_BRAND] = true;\n\n constructor(initialValue: T, sync: boolean) {\n super();\n this._value = initialValue;\n this._pendingOldValue = undefined;\n\n if (sync) {\n this.flags |= ATOM_STATE_FLAGS.SYNC;\n }\n\n debug.attachDebugInfo(this, 'atom', this.id);\n }\n\n get value(): T {\n const context = trackingContext.current;\n if (context != null) context.addDependency(this);\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 // 1. Check if notifications are needed\n const slots = this._slots;\n const flags = this.flags;\n if (slots == null || slots.size === 0 || flags & ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED) {\n return;\n }\n\n this._pendingOldValue = oldValue;\n const nextFlags = flags | ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED;\n this.flags = nextFlags;\n\n // 2. Schedule or flush\n if ((nextFlags & ATOM_STATE_FLAGS.SYNC) !== 0 && !scheduler.isBatching) {\n this._flushNotifications();\n return;\n }\n\n scheduler.schedule(this);\n }\n\n /**\n * Executes scheduled notification.\n * @internal\n */\n execute(): void {\n this._flushNotifications();\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._slots?.clear();\n this.flags |= ATOM_STATE_FLAGS.DISPOSED;\n // Release references\n this._value = undefined as T;\n this._pendingOldValue = undefined;\n }\n\n protected override _deepDirtyCheck(): boolean {\n return false;\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 { BITPACK } from '@/constants';\nimport type { DependencyLink } from '@/core/dep-tracking';\nimport type { Dependency } from '@/types';\nimport { SlotBuffer } from './slot-buffer';\n\n/**\n * Specialized inline-slot container for dependency tracking.\n *\n * Inherits from `SlotBuffer` to share the same zero-allocation inline\n * properties (`_s0`...`_s3`). Adds dependency-specific in-place updates,\n * truncation, and a hybrid O(1) Map fallback for mega-node performance.\n */\nexport class DepSlotBuffer extends SlotBuffer<DependencyLink> {\n private _map: Map<Dependency, number> | null = null;\n private readonly _SCAN_THRESHOLD = 32;\n\n /**\n * Indicates if the buffer contains at least one computed dependency.\n */\n hasComputeds = false;\n\n /**\n * Cached dependency version snapshot hash.\n */\n _depsHash = 0;\n\n constructor() {\n super();\n // Initialize state-related fields explicitly for a stable V8 hidden class shape.\n this._map = null;\n this.hasComputeds = false;\n this._depsHash = 0;\n }\n\n /**\n * Resets tracking metadata for a new evaluation pass.\n * Ensures 'hasComputeds' is clean.\n */\n prepareTracking(): void {\n this.hasComputeds = false;\n }\n\n /**\n * Protected hook called whenever a link is extracted from the buffer.\n * Handles automatic unsubscription without closure allocation.\n */\n protected override _onItemRemoved(link: DependencyLink): void {\n const unsub = link.unsub;\n if (unsub) unsub();\n }\n\n /**\n * Looks for an existing subscription to the given node starting from `trackIndex`.\n * If found, swaps it to `trackIndex`, updates version, and returns true.\n */\n claimExisting(dep: Dependency, trackIndex: number): boolean {\n const count = this._count;\n if (trackIndex >= count) return false;\n\n // 1. Hybrid O(1) Map Fallback for Mega-Nodes\n const remaining = count - trackIndex;\n if (this._map !== null || remaining > this._SCAN_THRESHOLD) {\n return this._claimViaMap(dep, trackIndex);\n }\n\n // 2. Unrolled Fast Path for Inline Slots (0..3)\n // Avoids overhead of getAt/setAt by using switch-fallthrough and direct access.\n if (trackIndex < 4) {\n switch (trackIndex) {\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for sequential search\n case 0: {\n const l = this._s0;\n if (l && l.node === dep && l.unsub) {\n l.version = dep.version;\n return true;\n }\n }\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for sequential search\n case 1: {\n if (count > 1) {\n const l = this._s1;\n if (l && l.node === dep && l.unsub) {\n l.version = dep.version;\n if (trackIndex !== 1) {\n // we know trackIndex is 0 here\n this._s1 = this._s0;\n this._s0 = l;\n }\n return true;\n }\n }\n }\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for sequential search\n case 2: {\n if (count > 2) {\n const l = this._s2;\n if (l && l.node === dep && l.unsub) {\n l.version = dep.version;\n if (trackIndex !== 2) {\n // swap with trackIndex (0 or 1)\n const occ = trackIndex === 0 ? this._s0 : this._s1;\n if (trackIndex === 0) this._s0 = l;\n else this._s1 = l;\n this._s2 = occ;\n }\n return true;\n }\n }\n }\n case 3: {\n if (count > 3) {\n const l = this._s3;\n if (l && l.node === dep && l.unsub) {\n l.version = dep.version;\n if (trackIndex !== 3) {\n // swap with trackIndex (0, 1, or 2)\n let occ: DependencyLink | null;\n if (trackIndex === 0) {\n occ = this._s0;\n this._s0 = l;\n } else if (trackIndex === 1) {\n occ = this._s1;\n this._s1 = l;\n } else {\n occ = this._s2;\n this._s2 = l;\n }\n this._s3 = occ;\n }\n return true;\n }\n }\n }\n }\n }\n\n // 3. Sequential Scan for Overflow\n const start = trackIndex > 4 ? trackIndex : 4;\n const ov = this._overflow;\n if (ov) {\n for (let i = start - 4, len = ov.length; i < len; i++) {\n const link = ov[i];\n if (link && link.node === dep && link.unsub) {\n link.version = dep.version;\n this._swapGeneral(i + 4, trackIndex, link);\n return true;\n }\n }\n }\n\n return false;\n }\n\n private _claimViaMap(dep: Dependency, trackIndex: number): boolean {\n if (this._map === null) {\n this._map = new Map();\n const count = this._count;\n // Partitioned scan to avoid getAt() dispatch in loop\n if (trackIndex < 4) {\n if (trackIndex <= 0 && this._s0?.unsub) this._map.set(this._s0.node, 0);\n if (trackIndex <= 1 && this._s1?.unsub) this._map.set(this._s1.node, 1);\n if (trackIndex <= 2 && this._s2?.unsub) this._map.set(this._s2.node, 2);\n if (trackIndex <= 3 && this._s3?.unsub) this._map.set(this._s3.node, 3);\n }\n const ov = this._overflow;\n if (ov && count > 4) {\n const start = trackIndex > 4 ? trackIndex : 4;\n for (let i = start - 4, len = ov.length; i < len; i++) {\n const link = ov[i];\n if (link?.unsub) this._map.set(link.node, i + 4);\n }\n }\n }\n\n const existingIndex = this._map.get(dep);\n if (existingIndex === undefined || existingIndex < trackIndex) return false;\n\n const link = this.getAt(existingIndex);\n if (link == null || !link.unsub) return false;\n\n link.version = dep.version;\n if (existingIndex !== trackIndex) {\n // Inlined swap to avoid dispatch overhead\n const occupant = this.getAt(trackIndex);\n this.setAt(trackIndex, link);\n this.setAt(existingIndex, occupant);\n if (occupant?.unsub) this._map.set(occupant.node, existingIndex);\n this._map.set(dep, trackIndex);\n }\n return true;\n }\n\n private _swapGeneral(idx: number, trackIndex: number, link: DependencyLink): void {\n if (idx === trackIndex) return;\n\n // Use direct access for the likely case where idx is in overflow\n const occupant = this.getAt(trackIndex);\n this.setAt(trackIndex, link);\n\n if (idx === 0) this._s0 = occupant;\n else if (idx === 1) this._s1 = occupant;\n else if (idx === 2) this._s2 = occupant;\n else if (idx === 3) this._s3 = occupant;\n else {\n const ov = this._overflow!;\n ov[idx - 4] = occupant;\n }\n }\n\n /**\n * Inserts a new link at `trackIndex`, relocating the current occupant\n * to the end of the buffer so it can be cleanly unsubscribed later by `truncateFrom`.\n */\n insertNew(trackIndex: number, link: DependencyLink): void {\n const count = this._count;\n if (trackIndex < count) {\n const occupant = this.getAt(trackIndex);\n if (occupant != null) {\n // Direct overflow append avoids inline gap-scan overhead in add()\n // since we know all inline slots are occupied when trackIndex < count.\n this._addToOverflow(occupant);\n if (this._map !== null && occupant.unsub) {\n this._map.set(occupant.node, this._count - 1);\n }\n }\n }\n\n if (trackIndex === 0) this._s0 = link;\n else if (trackIndex === 1) this._s1 = link;\n else if (trackIndex === 2) this._s2 = link;\n else if (trackIndex === 3) this._s3 = link;\n else {\n let ov = this._overflow;\n if (!ov) {\n ov = [];\n this._overflow = ov;\n }\n ov[trackIndex - 4] = link;\n }\n\n if (trackIndex >= count) {\n this._count = trackIndex + 1;\n }\n }\n\n /**\n * Discards all links from the given index onwards.\n * Unsubscribes each link before removing it.\n */\n truncateFrom(index: number): void {\n if (index >= this._count) return;\n\n super.truncateFrom(index);\n\n if (this._map !== null) {\n this._map.clear();\n this._map = null;\n }\n }\n\n /**\n * Seals the buffer after a tracking pass completes.\n * Computes the additive snapshot hash of all dependency versions.\n *\n * Uses link.version (snapshot at tracking time) — NOT node.version.\n */\n seal(): void {\n const count = this._count;\n if (count === 0) {\n this._depsHash = 0;\n return;\n }\n\n const vbits = BITPACK.VERSION_BITS;\n let hash = 0;\n\n // Inline slots (unrolled)\n if (count >= 1) {\n const l = this._s0!;\n hash = (hash + (l.version << vbits) + l.node.id) | 0;\n }\n if (count >= 2) {\n const l = this._s1!;\n hash = (hash + (l.version << vbits) + l.node.id) | 0;\n }\n if (count >= 3) {\n const l = this._s2!;\n hash = (hash + (l.version << vbits) + l.node.id) | 0;\n }\n if (count >= 4) {\n const l = this._s3!;\n hash = (hash + (l.version << vbits) + l.node.id) | 0;\n }\n\n // Overflow\n if (count > 4) {\n const ov = this._overflow!;\n for (let i = 0, len = ov.length; i < len; i++) {\n const l = ov[i]!;\n hash = (hash + (l.version << vbits) + l.node.id) | 0;\n }\n }\n\n this._depsHash = hash;\n }\n\n /**\n * Efficient O(N) fast-path dirty check using the sealed version hash.\n *\n * Uses node.version (current live version) to detect drift from\n * the sealed snapshot.\n */\n isDirtyFast(): boolean {\n const count = this._count;\n if (count === 0) return false;\n\n const vbits = BITPACK.VERSION_BITS;\n let hash = 0;\n\n // Inline slots (unrolled)\n if (count >= 1) {\n const n = this._s0!.node;\n hash = (hash + (n.version << vbits) + n.id) | 0;\n }\n if (count >= 2) {\n const n = this._s1!.node;\n hash = (hash + (n.version << vbits) + n.id) | 0;\n }\n if (count >= 3) {\n const n = this._s2!.node;\n hash = (hash + (n.version << vbits) + n.id) | 0;\n }\n if (count >= 4) {\n const n = this._s3!.node;\n hash = (hash + (n.version << vbits) + n.id) | 0;\n }\n\n // Overflow\n if (count > 4) {\n const ov = this._overflow!;\n for (let i = 0, len = ov.length; i < len; i++) {\n const n = ov[i]!.node;\n hash = (hash + (n.version << vbits) + n.id) | 0;\n }\n }\n\n return hash !== this._depsHash;\n }\n\n /** Unsubscribes from all links and resets the buffer. */\n disposeAll(): void {\n if (this._count > 0) {\n this.truncateFrom(0);\n }\n this.hasComputeds = false;\n if (this._map !== null) {\n this._map.clear();\n this._map = null;\n }\n }\n\n /**\n * [Safety Guard]\n * remove() is strictly prohibited in DepSlotBuffer to preserve sequential cache paths.\n */\n override remove(_item: DependencyLink): boolean {\n throw new Error(\n 'remove() is strictly prohibited in DepSlotBuffer to preserve sequential cache paths.'\n );\n }\n\n /**\n * [Safety Guard]\n * Compaction is unnecessary since remove() is prohibited.\n */\n override compact(): void {\n // No-op for DepSlotBuffer\n }\n}\n","import { ATOM_BRAND, COMPUTED_BRAND, EFFECT_BRAND, WRITABLE_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 *\n * Uses a dedicated positive brand instead of `!isComputed()` to remain\n * correct if new ReadonlyAtom-style primitives are added in the future.\n */\nexport function isWritable(obj: unknown): obj is WritableAtom {\n return obj !== null && typeof obj === 'object' && WRITABLE_BRAND in 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 EPOCH_CONSTANTS,\n IS_DEV,\n SMI_MAX,\n} from '@/constants';\nimport { ReactiveNode } from '@/core/base';\nimport { DependencyLink } from '@/core/dep-tracking';\nimport { ComputedError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport { DepSlotBuffer } from '@/internal/dep-slot-buffer';\nimport { currentFlushEpoch, nextEpoch, nextVersion } from '@/internal/epoch';\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 {\n IDLE,\n DIRTY,\n PENDING,\n RESOLVED,\n REJECTED,\n HAS_ERROR,\n RECOMPUTING,\n DISPOSED,\n IS_COMPUTED,\n FORCE_COMPUTE,\n} = COMPUTED_STATE_FLAGS;\n\n/**\n * Computed atom implementation.\n */\nclass ComputedAtomImpl<T> extends ReactiveNode<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 /** Initialized in constructor. Unified node property. */\n _deps = new DepSlotBuffer();\n\n // Async state\n\n private _asyncRetryCount = 0;\n private _lastDriftEpoch: number = EPOCH_CONSTANTS.UNINITIALIZED;\n\n // Dependency collection state\n private _trackEpoch: number = EPOCH_CONSTANTS.UNINITIALIZED;\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 trackingContext.current?.addDependency(this);\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 if (\n (flags & IDLE) === 0 &&\n (flags & FORCE_COMPUTE) === 0 &&\n this._deps.size > 0 &&\n !this._isDirty()\n ) {\n // Deps-stable skip: dependencies haven't changed, output remains the same\n this.flags &= ~DIRTY;\n } else {\n this._recompute();\n }\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 const flags = this.flags;\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 get hasError(): boolean {\n this._track();\n const flags = this.flags;\n // Fast path: self has error\n if (flags & (REJECTED | HAS_ERROR)) return true;\n\n // Fast path: if no computed dependencies, none can have errors\n const deps = this._deps;\n if (!deps.hasComputeds) return false;\n\n const size = deps.size;\n for (let i = 0; i < size; i++) {\n const link = deps.getAt(i);\n if (link != null && link.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\n // 1. Collect errors\n const collected: Error[] = [];\n if (this._error) collected.push(this._error);\n\n const deps = this._deps;\n // Early exit: no computed dependencies means no bubbling errors\n if (!deps.hasComputeds) {\n return collected.length === 0 ? EMPTY_ERROR_ARRAY : Object.freeze(collected);\n }\n\n const size = deps.size;\n for (let i = 0; i < size; i++) {\n const link = deps.getAt(i);\n if (link == null) continue;\n\n const dep = link.node;\n if (dep.flags & HAS_ERROR) {\n this._collectErrorsFromDep(dep as unknown as ComputedAtom<unknown>, collected);\n }\n }\n\n return collected.length === 0 ? EMPTY_ERROR_ARRAY : Object.freeze(collected);\n }\n\n private _collectErrorsFromDep(computedDep: ComputedAtom<unknown>, collected: Error[]): void {\n const errs = computedDep.errors;\n const len = errs.length;\n for (let j = 0; j < len; j++) {\n const err = errs[j];\n if (err != null && !collected.includes(err)) {\n collected.push(err);\n }\n }\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.flags |= FORCE_COMPUTE;\n this._markDirty();\n }\n\n dispose(): void {\n if (this.flags & DISPOSED) return;\n\n this._deps.disposeAll();\n\n this._slots?.clear();\n this.flags = DISPOSED | DIRTY | IDLE;\n\n // Release Memory\n this._error = null;\n this._value = undefined as T;\n this._hotIndex = -1;\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n addDependency(dep: Dependency): void {\n if (dep._lastSeenEpoch === this._trackEpoch) return;\n dep._lastSeenEpoch = this._trackEpoch;\n\n const trackIndex = this._trackCount;\n const existing = this._deps.getAt(trackIndex);\n\n // 1. Stable Path: dependency index remains the same\n if (existing != null && existing.node === dep) {\n existing.version = dep.version;\n }\n // 2. Diverged Path: lookup or insert\n else if (this._deps.claimExisting(dep, trackIndex)) {\n // Version updated inside claimExisting\n }\n // 3. New dependency\n else {\n const link = new DependencyLink(dep, dep.version, dep.subscribe(this));\n this._deps.insertNew(trackIndex, link);\n }\n\n if (dep.flags & IS_COMPUTED) {\n this._deps.hasComputeds = true;\n }\n this._trackCount = trackIndex + 1;\n }\n\n private _recompute(): void {\n if (this.flags & RECOMPUTING) return;\n this.flags = (this.flags | RECOMPUTING) & ~FORCE_COMPUTE;\n\n this._trackEpoch = nextEpoch();\n this._trackCount = 0;\n this._deps.prepareTracking();\n this._hotIndex = -1;\n\n let committed = false;\n try {\n // Execute function\n const result = trackingContext.run(this, this._fn);\n\n // Clean up any remaining trailing dependencies\n this._deps.truncateFrom(this._trackCount);\n this._deps.seal();\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 gracefully\n if (!committed) {\n try {\n this._deps.truncateFrom(this._trackCount);\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 // Reset transient state\n this._trackEpoch = EPOCH_CONSTANTS.UNINITIALIZED;\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._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 if (this._isDirty()) {\n // Reset retry counter when flush epoch changes — drifts across different\n // scheduler flushes are independent bursts, not a continuous failure streak.\n const epoch = currentFlushEpoch();\n if (this._lastDriftEpoch !== epoch) {\n this._lastDriftEpoch = epoch;\n this._asyncRetryCount = 0;\n }\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 _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 * Optimized dirty check. Bypasses deep scan if only Atoms are involved.\n */\n protected override _isDirty(): boolean {\n const deps = this._deps;\n if (deps.hasComputeds) return this._deepDirtyCheck();\n return deps.isDirtyFast();\n }\n\n /**\n * Deep dirty check for computations.\n */\n protected override _deepDirtyCheck(): boolean {\n const deps = this._deps;\n const prevContext = trackingContext.current;\n trackingContext.current = null;\n\n try {\n const size = deps.size;\n for (let i = 0; i < size; i++) {\n const link = deps.getAt(i);\n if (link == null) continue;\n\n const dep = link.node;\n if (dep.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 }\n\n if (dep.version !== link.version) {\n this._hotIndex = i;\n return true;\n }\n }\n\n this._hotIndex = -1;\n return false;\n } finally {\n trackingContext.current = prevContext;\n }\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 EPOCH_CONSTANTS,\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 { DepSlotBuffer } from '@/internal/dep-slot-buffer';\nimport {\n currentFlushEpoch,\n flushExecutionCount,\n incrementFlushExecutionCount,\n nextEpoch,\n} from '@/internal/epoch';\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<void> implements EffectObject, DependencyTracker {\n /** @internal */\n readonly [EFFECT_BRAND] = true;\n\n private _cleanup: (() => void) | null = null;\n /** Initialized in constructor to maintain God Class object shape */\n _deps = new DepSlotBuffer();\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: number = EPOCH_CONSTANTS.UNINITIALIZED;\n private _lastFlushEpoch: number = EPOCH_CONSTANTS.UNINITIALIZED;\n private _executionsInEpoch: number;\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: number;\n private _windowStart: number;\n private _windowCount: number;\n private _execId: number;\n private _trackCount: number;\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\n this._cleanup = null;\n this._deps = new DepSlotBuffer();\n this._currentEpoch = EPOCH_CONSTANTS.UNINITIALIZED;\n this._lastFlushEpoch = EPOCH_CONSTANTS.UNINITIALIZED;\n this._executionsInEpoch = 0;\n this._executionCount = 0;\n this._windowStart = 0;\n this._windowCount = 0;\n this._execId = 0;\n this._trackCount = 0;\n\n // Pre-allocate callbacks once — eliminates per-dependency closure allocation\n if (this._sync) {\n this._notifyCallback = () => this.execute();\n } else {\n this._notifyCallback = () => scheduler.schedule(this);\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._deps?.disposeAll();\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n public addDependency(dep: Dependency): void {\n if (!(this.flags & EFFECT_STATE_FLAGS.EXECUTING)) return;\n\n const startEpoch = this._currentEpoch;\n if (dep._lastSeenEpoch === startEpoch) return;\n dep._lastSeenEpoch = startEpoch;\n\n const trackIndex = this._trackCount;\n const deps = this._deps!;\n\n // Optimized: Direct access to inline slots for the hottest 4 dependencies\n let existing: DependencyLink | null;\n if (trackIndex === 0) existing = deps._s0;\n else if (trackIndex === 1) existing = deps._s1;\n else if (trackIndex === 2) existing = deps._s2;\n else if (trackIndex === 3) existing = deps._s3;\n else existing = deps.getAt(trackIndex);\n\n // 1. Stable Path: dependency index remains the same\n if (existing != null && existing.node === dep) {\n existing.version = dep.version;\n }\n // 2. Diverged Path: lookup or insert\n else if (deps.claimExisting(dep, trackIndex)) {\n // Version updated in claimExisting\n }\n // 3. New dependency\n else {\n this._insertNewDependency(dep, trackIndex);\n }\n\n if (dep.flags & COMPUTED_STATE_FLAGS.IS_COMPUTED) {\n deps.hasComputeds = true;\n }\n this._trackCount = trackIndex + 1;\n }\n\n private _insertNewDependency(dep: Dependency, trackIndex: number): void {\n let link: DependencyLink;\n try {\n const unsubscribe = dep.subscribe(this._notifyCallback);\n link = 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 link = new DependencyLink(dep, dep.version, undefined);\n }\n\n this._deps!.insertNew(trackIndex, link);\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 const deps = this._deps!;\n if (!force && deps.size > 0 && !this._isDirty()) return;\n\n this._checkInfiniteLoops();\n\n this.flags |= EFFECT_STATE_FLAGS.EXECUTING;\n this._execCleanup();\n\n this._currentEpoch = nextEpoch();\n this._trackCount = 0;\n deps.prepareTracking();\n this._hotIndex = -1;\n\n let committed = false;\n try {\n const result = trackingContext.run(this, this._fn);\n\n // Clean up any remaining trailing dependencies\n deps.truncateFrom(this._trackCount);\n deps.seal();\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 gracefully to maintain state for recovery\n if (!committed) {\n try {\n deps.truncateFrom(this._trackCount);\n } catch (commitErr) {\n if (IS_DEV) {\n console.warn('[atom-effect] _commitDeps failed during error recovery:', commitErr);\n }\n }\n }\n this._handleExecutionError(error);\n this._cleanup = null;\n } finally {\n this.flags &= ~EFFECT_STATE_FLAGS.EXECUTING;\n }\n }\n\n /**\n * Optimized dirty check. Bypasses deep scan if only Atoms are involved.\n */\n protected override _isDirty(): boolean {\n const deps = this._deps;\n if (deps.hasComputeds) return this._deepDirtyCheck();\n return deps.isDirtyFast();\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 protected override _deepDirtyCheck(): boolean {\n const prevContext = trackingContext.current;\n trackingContext.current = null;\n const deps = this._deps!;\n\n try {\n const size = deps.size;\n for (let i = 0; i < size; i++) {\n const link = deps.getAt(i);\n if (link == null) continue;\n\n const dep = link.node;\n if (dep.flags & COMPUTED_STATE_FLAGS.IS_COMPUTED) {\n this._tryPullComputed(dep);\n }\n\n if (dep.version !== link.version) {\n this._hotIndex = i;\n return true;\n }\n }\n return false;\n } finally {\n trackingContext.current = prevContext;\n }\n }\n\n private _tryPullComputed(dep: Dependency): void {\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 }\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 const executions = ++this._executionsInEpoch;\n if (executions > this._maxExecutionsPerFlush) this._throwInfiniteLoopError('per-effect');\n\n const globalExecutions = incrementFlushExecutionCount();\n if (globalExecutions > SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_FLUSH) {\n this._throwInfiniteLoopError('global');\n }\n\n this._executionCount++;\n\n if (IS_DEV) this._checkFrequencyLimit();\n }\n\n private _checkFrequencyLimit(): void {\n if (!Number.isFinite(this._maxExecutions)) return;\n\n const now = Date.now();\n if (now - this._windowStart >= DEBUG_CONFIG.EFFECT_FREQUENCY_WINDOW) {\n this._windowStart = now;\n this._windowCount = 1;\n return;\n }\n\n 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 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 { ERROR_MESSAGES } from '@/errors/messages';\nimport { 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(ERROR_MESSAGES.BATCH_CALLBACK_MUST_BE_FUNCTION);\n }\n\n scheduler.startBatch();\n try {\n return fn();\n } finally {\n scheduler.endBatch();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/constants.ts","../src/core/dep-tracking.ts","../src/errors/errors.ts","../src/errors/messages.ts","../src/internal/slot-buffer.ts","../src/utils/debug.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/internal/dep-slot-buffer.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 /** Flagged when explicitly invalidated. Bypasses fast-path dirty checks. */\n FORCE_COMPUTE: 1 << 10,\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 * 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 * Epoch sentinel values.\n */\nexport const EPOCH_CONSTANTS = {\n /** Uninitialized epoch marker. Used as initial value before any flush has occurred. */\n UNINITIALIZED: -1,\n /** Minimum valid epoch value after a counter reset. */\n MIN: 1,\n} as const;\n\n/**\n * V8 Small Integer (SMI) max value.\n */\nexport const SMI_MAX = 0x3fffffff;\n\n/**\n * Bit-packing constants for versioned slot operations.\n * Used by DepSlotBuffer for O(1) snapshot hashing.\n */\nexport const BITPACK = {\n /** Bits allocated for version in a packed slot value. */\n VERSION_BITS: 16,\n} as const;\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","import type { Dependency, Subscriber } from '@/types';\n// trackDependency removed as it was obsolete and caused polymorphic cache misses\n\n/**\n * Dependency graph edge.\n */\nexport class DependencyLink {\n constructor(\n public node: Dependency,\n public version: number,\n // Always initialize to maintain consistent V8 hidden class\n public unsub: (() => void) | undefined = undefined\n ) {}\n}\n\n/**\n * Subscription entry.\n */\nexport class Subscription<T> {\n constructor(\n // Always initialize both properties to maintain consistent V8 hidden class\n public fn: ((newValue?: T, oldValue?: T) => void) | undefined,\n public sub: Subscriber | undefined\n ) {}\n\n notify(newValue?: T, oldValue?: T): void {\n const fn = this.fn;\n if (fn !== undefined) {\n fn(newValue, oldValue);\n return;\n }\n\n const sub = this.sub;\n if (sub !== undefined) {\n sub.execute();\n }\n }\n}\n","/**\n * Base error class.\n */\nexport class AtomError extends Error {\n override name = 'AtomError';\n\n constructor(\n message: string,\n public cause: Error | null = null,\n public recoverable = true\n ) {\n super(message);\n }\n}\n\n/** Computed error. */\nexport class ComputedError extends AtomError {\n override name = 'ComputedError';\n\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, true);\n }\n}\n\n/** Effect error. */\nexport class EffectError extends AtomError {\n override name = 'EffectError';\n\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, false);\n }\n}\n\n/** Scheduler error. */\nexport class SchedulerError extends AtomError {\n override name = 'SchedulerError';\n\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, false);\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 BATCH_CALLBACK_MUST_BE_FUNCTION: 'Batch callback must be a function',\n} as const;\n","/**\n * Inline-slot subscriber container.\n *\n * Stores up to 4 items directly as object properties\n * (zero array allocation). Spills to an overflow array only when the\n * inline slots are exhausted.\n *\n * Design goals:\n * - **Cache locality**: hot-path data lives on the same V8 object.\n * - **Logical deletion**: `remove()` nulls a slot and decrements `_count`.\n * Physical compaction is deferred to `compact()`.\n * - **O(1) overflow reuse**: free-index stack avoids linear gap scan.\n *\n * @template T - Slot element type (e.g. `Subscription<V>`).\n */\nexport class SlotBuffer<T> {\n // ── Inline slots ──────────────────────────────────────────────────────\n // Always declared to lock V8 hidden class shape.\n _s0: T | null = null;\n _s1: T | null = null;\n _s2: T | null = null;\n _s3: T | null = null;\n\n // ── Bookkeeping ───────────────────────────────────────────────────────\n /** Active (non-null) element count across slots + overflow. */\n _count = 0;\n\n /** Lazy-allocated overflow array for subscribers beyond inline capacity. */\n _overflow: (T | null)[] | null = null;\n\n /** Free overflow indices for O(1) gap reuse (lazy-allocated). */\n _freeIndices: number[] | null = null;\n\n // ── Public API ────────────────────────────────────────────────────────\n\n /** Number of active (non-null) elements. */\n get size(): number {\n return this._count;\n }\n\n getAt(index: number): T | null {\n if (index < 4) {\n switch (index) {\n case 0:\n return this._s0;\n case 1:\n return this._s1;\n case 2:\n return this._s2;\n case 3:\n return this._s3;\n }\n }\n const ov = this._overflow;\n if (ov !== null) {\n const el = ov[index - 4];\n return el === undefined ? null : el;\n }\n return null;\n }\n\n /** Overwrites an item at a specific index. */\n setAt(index: number, item: T | null): void {\n switch (index) {\n case 0:\n this._s0 = item;\n break;\n case 1:\n this._s1 = item;\n break;\n case 2:\n this._s2 = item;\n break;\n case 3:\n this._s3 = item;\n break;\n default: {\n this._overflow ??= [];\n this._overflow[index - 4] = item;\n }\n }\n\n if (index >= this._count) {\n this._count = index + 1;\n }\n }\n\n truncateFrom(index: number): void {\n const count = this._count;\n if (index >= count) return;\n\n // 1. Unroll Inline Slots Cleanup: Simplified sequential check\n if (index <= 3) {\n if (index <= 0) {\n const s = this._s0;\n if (s != null) {\n this._onItemRemoved(s);\n this._s0 = null;\n }\n }\n if (index <= 1) {\n const s = this._s1;\n if (s != null) {\n this._onItemRemoved(s);\n this._s1 = null;\n }\n }\n if (index <= 2) {\n const s = this._s2;\n if (s != null) {\n this._onItemRemoved(s);\n this._s2 = null;\n }\n }\n if (index <= 3) {\n const s = this._s3;\n if (s != null) {\n this._onItemRemoved(s);\n this._s3 = null;\n }\n }\n }\n\n // 2. Overflow Cleanup\n const ov = this._overflow;\n if (ov !== null && count > 4) {\n const offsetIdx = index > 4 ? index - 4 : 0;\n const len = ov.length;\n for (let i = offsetIdx; i < len; i++) {\n const item = ov[i];\n if (item != null) {\n this._onItemRemoved(item);\n ov[i] = null;\n }\n }\n\n if (index <= 4) {\n ov.length = 0;\n this._overflow = null;\n } else {\n ov.length = index - 4;\n }\n }\n\n // 3. Invalidate free indices (they may point to truncated positions)\n if (this._freeIndices !== null) {\n this._freeIndices = null;\n }\n\n this._count = index;\n }\n\n /**\n * Protected hook called whenever an item is logically removed from the buffer.\n * Allows subclasses (like DepSlotBuffer) to perform cleanup (unsubscribing)\n * without allocating temporary closures in hot paths.\n */\n protected _onItemRemoved(_item: T): void {\n // Base implementation does nothing\n }\n\n /**\n * Adds an item.\n *\n * Prefers filling a null inline slot (including previously-cleared ones)\n * before spilling to the overflow array. Uses O(1) free-index stack\n * for overflow gap reuse.\n */\n add(item: T): void {\n // Fast path: fill inline slots first\n if (this._s0 === null) {\n this._s0 = item;\n this._count++;\n return;\n }\n if (this._s1 === null) {\n this._s1 = item;\n this._count++;\n return;\n }\n if (this._s2 === null) {\n this._s2 = item;\n this._count++;\n return;\n }\n if (this._s3 === null) {\n this._s3 = item;\n this._count++;\n return;\n }\n\n // Overflow path with O(1) free-index reuse\n this._addToOverflow(item);\n }\n\n /**\n * Internal helper to add an item directly to the overflow array,\n * bypassing inline slot checks. Used by DepSlotBuffer for relocation.\n *\n * @internal\n */\n protected _addToOverflow(item: T): void {\n const ov = this._overflow;\n if (ov === null) {\n this._overflow = [item];\n } else {\n const free = this._freeIndices;\n if (free !== null && free.length > 0) {\n ov[free.pop()!] = item;\n } else {\n ov.push(item);\n }\n }\n this._count++;\n }\n\n /**\n * Removes the first occurrence of {@link item} via identity comparison.\n *\n * The slot is nulled out (logical deletion). Call {@link compact}\n * after notification traversal to reclaim the gaps.\n *\n * @returns `true` if the item was found and removed.\n */\n remove(item: T): boolean {\n if (this._s0 === item) {\n this._s0 = null;\n this._count--;\n return true;\n }\n if (this._s1 === item) {\n this._s1 = null;\n this._count--;\n return true;\n }\n if (this._s2 === item) {\n this._s2 = null;\n this._count--;\n return true;\n }\n if (this._s3 === item) {\n this._s3 = null;\n this._count--;\n return true;\n }\n\n const ov = this._overflow;\n if (ov == null) return false;\n\n for (let i = 0, len = ov.length; i < len; i++) {\n if (ov[i] === item) {\n ov[i] = null;\n this._count--;\n // Track freed index for O(1) reuse\n let free = this._freeIndices;\n if (free === null) {\n free = this._freeIndices = [];\n }\n free.push(i);\n return true;\n }\n }\n return false;\n }\n\n has(item: T): boolean {\n const count = this._count;\n if (count === 0) return false;\n\n // 1. Inline Slots\n if (this._s0 === item || this._s1 === item || this._s2 === item || this._s3 === item) {\n return true;\n }\n\n // 2. Overflow Scan\n const ov = this._overflow;\n if (ov != null) {\n for (let i = 0, len = ov.length; i < len; i++) {\n if (ov[i] === item) return true;\n }\n }\n return false;\n }\n\n /**\n * Iterates over all non-null elements.\n *\n * Safe to call during notification — newly-added or removed items\n * during iteration follow the same snapshot semantics as the old\n * array-based approach (length captured upfront for overflow).\n */\n forEach(fn: (item: T) => void): void {\n const count = this._count;\n if (count === 0) return;\n\n let executed = 0;\n // 1. Inline slots\n const s0 = this._s0;\n if (s0 != null) {\n fn(s0);\n if (++executed === count) return;\n }\n const s1 = this._s1;\n if (s1 != null) {\n fn(s1);\n if (++executed === count) return;\n }\n const s2 = this._s2;\n if (s2 != null) {\n fn(s2);\n if (++executed === count) return;\n }\n const s3 = this._s3;\n if (s3 != null) {\n fn(s3);\n if (++executed === count) return;\n }\n\n // 2. Overflow\n const ov = this._overflow;\n if (ov != null) {\n for (let i = 0, len = ov.length; i < len; i++) {\n const el = ov[i];\n if (el != null) {\n fn(el);\n if (++executed === count) return;\n }\n }\n }\n }\n\n /**\n * Iterates with index-based access for length-captured traversal.\n *\n * Returns the total number of slots to iterate (inline + overflow).\n * Used by `_notifySubscribers` for length-captured iteration.\n */\n forEachIndexed(fn: (item: T) => void): number {\n const count = this._count;\n if (count === 0) return 0;\n\n // 1. Inline slots\n let executed = 0;\n const s0 = this._s0;\n if (s0 != null) {\n fn(s0);\n if (++executed === count) return executed;\n }\n const s1 = this._s1;\n if (s1 != null) {\n fn(s1);\n if (++executed === count) return executed;\n }\n const s2 = this._s2;\n if (s2 != null) {\n fn(s2);\n if (++executed === count) return executed;\n }\n const s3 = this._s3;\n if (s3 != null) {\n fn(s3);\n if (++executed === count) return executed;\n }\n\n // 2. Overflow\n const ov = this._overflow;\n if (ov != null) {\n for (let i = 0, len = ov.length; i < len; i++) {\n const el = ov[i];\n if (el != null) {\n fn(el);\n if (++executed === count) return executed;\n }\n }\n }\n return executed;\n }\n\n /**\n * Compacts the overflow array by removing null gaps.\n *\n * Inline slots are not compacted — they stay null until reused by\n * `add()`. This keeps the V8 hidden class stable.\n */\n compact(): void {\n const ov = this._overflow;\n if (ov === null) return;\n\n let len = ov.length;\n if (len === 0) return;\n\n // Pop-and-swap compaction with proper null handling\n let i = 0;\n while (i < len) {\n if (ov[i] === null) {\n // Pop trailing nulls first to find a valid swap candidate\n while (len > i && ov[len - 1] === null) {\n ov.pop();\n len--;\n }\n // If there's still a valid element beyond i, swap it in\n if (len > i) {\n ov[i] = ov.pop()!;\n len--;\n i++;\n }\n } else {\n i++;\n }\n }\n\n // Invalidate free indices after compaction (positions have shifted)\n this._freeIndices = null;\n\n // Release overflow array when empty\n if (len === 0) {\n this._overflow = null;\n }\n }\n\n /**\n * Clears the buffer and releases all item references for GC.\n */\n clear(): void {\n this._s0 = null;\n this._s1 = null;\n this._s2 = null;\n this._s3 = null;\n this._count = 0;\n\n if (this._overflow !== null) {\n this._overflow.length = 0;\n this._overflow = null;\n }\n this._freeIndices = null;\n }\n\n /**\n * Hard dispose — releases all references for GC.\n */\n dispose(): void {\n this.clear();\n }\n}\n","import { DEBUG_CONFIG, IS_DEV } from '@/constants';\nimport type { DebugConfig, 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 * Debug controller implementation.\n */\nclass DebugController implements DebugConfig {\n public enabled = IS_DEV;\n public warnInfiniteLoop = DEBUG_CONFIG.WARN_INFINITE_LOOP;\n\n public warn(cond: boolean, msg: string): void {\n if (!IS_DEV || !this.enabled || !cond) return;\n console.warn(`[Atom Effect] ${msg}`);\n }\n\n public attachDebugInfo(obj: object, type: string, id: DependencyId): void {\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 public getDebugName(obj: object | null): string | undefined {\n if (obj == null) return undefined;\n return (obj as Record<symbol, unknown>)[DEBUG_NAME] as string | undefined;\n }\n\n public getDebugType(obj: object | null): string | undefined {\n if (obj == null) return undefined;\n return (obj as Record<symbol, unknown>)[DEBUG_TYPE] as string | undefined;\n }\n}\n\n/**\n * Global debug controller singleton.\n */\nexport const debug: DebugConfig = new DebugController();\n\n/**\n * ID counter.\n */\nlet nextId = 1;\n\n/**\n * Generates ID.\n */\nexport const generateId = (): DependencyId => nextId++ | 0;\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 // 1. Skip if already wrapped\n if (error instanceof AtomError) {\n return error;\n }\n\n // 2. Handle native Error instances\n if (error instanceof Error) {\n const type = error.name || error.constructor.name || 'Error';\n return new ErrorClass(`${type} (${context}): ${error.message}`, error);\n }\n\n // 3. Handle unexpected types (string, number, etc.)\n return new ErrorClass(`Unexpected error (${context}): ${String(error)}`);\n}\n","import { COMPUTED_STATE_FLAGS, EPOCH_CONSTANTS, 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 { DepSlotBuffer } from '@/internal/dep-slot-buffer';\nimport { SlotBuffer } from '@/internal/slot-buffer';\nimport type { DependencyId, Subscriber } from '@/types';\nimport { generateId } from '@/utils/debug';\nimport { wrapError } from '@/utils/error';\n\n/**\n * Unified base class for all reactive nodes (Atoms, Computeds, Effects).\n *\n * Optimized for V8 Hidden Class Monomorphism by having a single, consistent\n * object shape for all reactive logic.\n *\n * @template T - The type of value produced by this node (used for subscriptions).\n */\nexport abstract class ReactiveNode<T> {\n /** [Producer/Consumer] State flags */\n flags: number;\n /** [Producer/Consumer] Version counter */\n version: number;\n /** [Producer/Consumer] Last access epoch */\n _lastSeenEpoch: number;\n /** [Context] Scheduler epoch tag */\n _nextEpoch?: number;\n /** [Debug] Unique ID for identify node in tracking maps */\n readonly id: DependencyId;\n\n /**\n * [Producer] Managed subscribers.\n */\n _slots: SlotBuffer<Subscription<T>> | null;\n\n /** [Producer] Re-entry guard for notification loop. */\n _notifying: number;\n\n /**\n * [Consumer] Managed dependencies.\n */\n _deps: DepSlotBuffer | null;\n /** [Consumer] O(1) Hot-path dependency index for rapid dirty checks. */\n _hotIndex: number;\n\n constructor() {\n this.flags = 0;\n this.version = 0;\n this._lastSeenEpoch = EPOCH_CONSTANTS.UNINITIALIZED;\n this._notifying = 0;\n this._hotIndex = -1;\n this._slots = null;\n this._deps = null;\n this.id = generateId() & SMI_MAX;\n }\n\n /**\n * Whether the node has been disposed.\n * @internal\n */\n get isDisposed(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.DISPOSED) !== 0; // Bit 0: DISPOSED\n }\n\n /**\n * Whether the node is a computed atom.\n * @internal\n */\n get isComputed(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.IS_COMPUTED) !== 0; // Bit 1: IS_COMPUTED\n }\n\n /**\n * Whether the node currently has an error.\n * @internal\n */\n get hasError(): boolean {\n return false;\n }\n\n // ============================================================================\n // Producer Logic (Subscriber Management)\n // ============================================================================\n\n /**\n * Adds subscriber for notifications.\n */\n subscribe(listener: ((newValue?: T, oldValue?: T) => void) | Subscriber): () => void {\n const isFn = typeof listener === 'function';\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 let slots = this._slots;\n if (!slots) {\n slots = new SlotBuffer<Subscription<T>>();\n this._slots = slots;\n }\n\n // Duplicate check: Unrolled for performance + early exit\n let duplicate = false;\n if (slots._s0 != null && (isFn ? slots._s0.fn === listener : slots._s0.sub === listener)) {\n duplicate = true;\n } else if (\n slots._s1 != null &&\n (isFn ? slots._s1.fn === listener : slots._s1.sub === listener)\n ) {\n duplicate = true;\n } else if (\n slots._s2 != null &&\n (isFn ? slots._s2.fn === listener : slots._s2.sub === listener)\n ) {\n duplicate = true;\n } else if (\n slots._s3 != null &&\n (isFn ? slots._s3.fn === listener : slots._s3.sub === listener)\n ) {\n duplicate = true;\n } else {\n const ov = slots._overflow;\n if (ov != null) {\n for (let i = 0, len = ov.length; i < len; i++) {\n const s = ov[i];\n if (s != null && (isFn ? s.fn === listener : s.sub === listener)) {\n duplicate = true;\n break;\n }\n }\n }\n }\n\n if (duplicate) {\n if (IS_DEV) console.warn(`[atom-effect] Duplicate subscription ignored on node ${this.id}`);\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 slots.add(link);\n return () => this._unsubscribe(link);\n }\n\n protected _unsubscribe(link: Subscription<T>): void {\n const slots = this._slots;\n if (!slots) return;\n\n slots.remove(link);\n if (this._notifying === 0) {\n slots.compact();\n }\n }\n\n /**\n * Returns current subscriber count.\n */\n subscriberCount(): number {\n const slots = this._slots;\n return slots === null ? 0 : slots.size;\n }\n\n /**\n * Notifies all subscribers about a value update.\n */\n protected _notifySubscribers(newValue: T | undefined, oldValue: T | undefined): void {\n const slots = this._slots;\n if (slots === null || slots.size === 0) return;\n\n this._notifying++;\n try {\n // 1. Inline slots: Manual unroll to avoid closure allocation\n let s = slots._s0;\n if (s != null) {\n try {\n s.notify(newValue, oldValue);\n } catch (e) {\n this._logNotifyError(e);\n }\n }\n s = slots._s1;\n if (s != null) {\n try {\n s.notify(newValue, oldValue);\n } catch (e) {\n this._logNotifyError(e);\n }\n }\n s = slots._s2;\n if (s != null) {\n try {\n s.notify(newValue, oldValue);\n } catch (e) {\n this._logNotifyError(e);\n }\n }\n s = slots._s3;\n if (s != null) {\n try {\n s.notify(newValue, oldValue);\n } catch (e) {\n this._logNotifyError(e);\n }\n }\n\n // 2. Overflow scan: Standard loop for performance\n const ov = slots._overflow;\n if (ov != null) {\n for (let i = 0, len = ov.length; i < len; i++) {\n const sub = ov[i];\n if (sub != null) {\n try {\n sub.notify(newValue, oldValue);\n } catch (e) {\n this._logNotifyError(e);\n }\n }\n }\n }\n } finally {\n if (--this._notifying === 0) {\n slots.compact();\n }\n }\n }\n\n private _logNotifyError(err: unknown): void {\n console.error(wrapError(err, AtomError, ERROR_MESSAGES.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED));\n }\n\n // ============================================================================\n // Consumer Logic (Dependency Validation)\n // ============================================================================\n\n /**\n * Determines if the node is dirty by checking its dependency chain.\n * Optimized with O(1) hot-path check.\n */\n protected _isDirty(): boolean {\n const deps = this._deps;\n if (deps === null || deps.size === 0) return false;\n\n // Phase 1: Hot-path Check - O(1)\n const hotIndex = this._hotIndex;\n if (hotIndex !== -1) {\n const hotLink = deps.getAt(hotIndex);\n if (hotLink != null && hotLink.node.version !== hotLink.version) {\n return true;\n }\n }\n\n // Phase 2: Standard Validation - O(N)\n if (!deps.hasComputeds && !deps.isDirtyFast()) return false;\n\n // Deep check for computeds\n return this._deepDirtyCheck();\n }\n\n /**\n * Deeply validates dependency versions.\n */\n protected abstract _deepDirtyCheck(): boolean;\n}\n","import { IS_DEV, SCHEDULER_CONFIG, SMI_MAX } from '@/constants';\n\n// Global epoch counter.\nlet collectorEpoch = 0;\n\n/**\n * Next tracking epoch.\n */\nexport function nextEpoch(): number {\n const next = (collectorEpoch + 1) & SMI_MAX;\n collectorEpoch = next === 0 ? 1 : next;\n return collectorEpoch;\n}\n\n/** Current tracking epoch. */\nexport function currentEpoch(): number {\n return collectorEpoch;\n}\n\n/** Increments a version counter within SMI range. Avoids 0 to reserve it for uninitialized state. */\nexport function nextVersion(v: number): number {\n const next = (v + 1) & SMI_MAX;\n return next === 0 ? 1 : next;\n}\n\nexport let flushExecutionCount = 0;\nlet isFlushing = false;\nlet _flushEpoch = 0;\n\n/** Current flush epoch. */\nexport function currentFlushEpoch(): number {\n return _flushEpoch;\n}\n\n/**\n * Starts flush cycle.\n */\nexport function startFlush(): boolean {\n if (isFlushing) {\n if (IS_DEV) {\n console.warn('startFlush() called during flush - ignored');\n }\n return false;\n }\n\n isFlushing = true;\n _flushEpoch = nextEpoch();\n flushExecutionCount = 0;\n return true;\n}\n\n/** Ends flush cycle. */\nexport function endFlush(): void {\n isFlushing = false;\n}\n\n/**\n * Runs a function within a flush scope.\n * Ensures endFlush() is called even if an error occurs.\n */\nexport function runInFlushScope<T>(fn: () => T): T | undefined {\n if (!startFlush()) {\n return undefined;\n }\n\n try {\n return fn();\n } finally {\n endFlush();\n }\n}\n\n/**\n * Increments execution count.\n * Throws an error if the count exceeds MAX_EXECUTIONS_PER_FLUSH.\n */\nexport function incrementFlushExecutionCount(): number {\n if (!isFlushing) return 0;\n\n const count = ++flushExecutionCount;\n if (count <= SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_FLUSH) {\n return count;\n }\n\n throw new Error(\n `[atom-effect] Infinite loop detected: flush execution count exceeded ${SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_FLUSH}`\n );\n}\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 interface SchedulerJobObject {\n execute(): void;\n /** Next scheduled epoch */\n _nextEpoch?: number;\n}\n\nexport interface SchedulerJobFunction {\n (): void;\n /** Next scheduled epoch */\n _nextEpoch?: number;\n}\n\nexport type SchedulerJob = SchedulerJobFunction | SchedulerJobObject;\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 _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 queueSize(): number {\n return this._size;\n }\n\n get isBatching(): boolean {\n return this._batchDepth > 0;\n }\n\n /**\n * Schedules job.\n */\n schedule(callback: SchedulerJob): void {\n if (IS_DEV) {\n const isFn = typeof callback === 'function';\n const isObj =\n typeof callback === 'object' &&\n callback !== null &&\n typeof (callback as SchedulerJobObject).execute === 'function';\n if (!isFn && !isObj) {\n throw new SchedulerError(ERROR_MESSAGES.SCHEDULER_CALLBACK_MUST_BE_FUNCTION);\n }\n }\n\n // Deduplicate job\n const epoch = this._epoch;\n if (callback._nextEpoch === epoch) return;\n callback._nextEpoch = epoch;\n\n if (this._batchDepth > 0 || this._isFlushingSync) {\n this._batchQueue[this._batchQueueSize++] = callback;\n return;\n }\n\n // Push to current active buffer\n const idx = this._bufferIndex;\n const buffer = this._queueBuffer[idx]!;\n buffer[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._batchDepth === 0) {\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 const queueSize = this._batchQueueSize;\n if (queueSize === 0) return;\n\n // Increment epoch\n const epoch = ++this._epoch;\n const bQueue = this._batchQueue;\n const idx = this._bufferIndex;\n const targetBuffer = this._queueBuffer[idx]!;\n let currentSize = this._size;\n\n // Merge batch using a cached size to avoid property lookups\n for (let i = 0; i < queueSize; i++) {\n const job = bQueue[i]!;\n // Retag jobs only if they belong to a different epoch\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 // Release references immediately while keeping array capacity\n bQueue.length = 0;\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 = (this._epoch + 1) | 0;\n\n // Execute jobs\n for (let i = 0; i < count; i++) {\n const job = jobs[i]!;\n try {\n if (typeof job === 'function') {\n job();\n } else {\n job.execute();\n }\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 const max = this._maxFlushIterations;\n\n console.error(new SchedulerError(ERROR_MESSAGES.SCHEDULER_FLUSH_OVERFLOW(max, droppedCount)));\n\n this._size = 0;\n const idx = this._bufferIndex;\n this._queueBuffer[idx]!.length = 0;\n this._batchQueueSize = 0;\n\n const onOverflow = this.onOverflow;\n if (onOverflow) {\n try {\n onOverflow(droppedCount);\n } catch {}\n }\n }\n\n startBatch(): void {\n this._batchDepth++;\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 }\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\n/**\n * Positive writable brand — only stamped on truly mutable atoms.\n * Allows future ReadonlyAtom / derived primitives to carry ATOM_BRAND\n * without being misidentified as writable by isWritable().\n */\nexport const WRITABLE_BRAND: unique symbol = Symbol.for('atom-effect/writable');\n","import type { Listener } from './tracking.types';\n\n/**\n * Tracking context implementation.\n */\nclass TrackingContext {\n /** Active listener. */\n public current: Listener | null = 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 public 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 * Global tracking context singleton.\n */\nexport const trackingContext = new TrackingContext();\n\n/**\n * Tracking context type.\n */\nexport type ITrackingContext = 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 ctx = trackingContext;\n const prev = ctx.current;\n\n // Optimized: Fast-path when already untracked\n if (prev === null) {\n return fn();\n }\n\n ctx.current = null;\n try {\n return fn();\n } finally {\n ctx.current = prev;\n }\n}\n","import { ATOM_STATE_FLAGS } from '@/constants';\nimport { ReactiveNode } from '@/core/base';\nimport { nextVersion } from '@/internal/epoch';\nimport { scheduler } from '@/internal/scheduler';\nimport { ATOM_BRAND, WRITABLE_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 ReactiveNode<T> implements WritableAtom<T> {\n private _value: T;\n /** Old value for notifications */\n private _pendingOldValue: T | undefined;\n\n /** @internal */\n readonly [ATOM_BRAND] = true;\n /** @internal */\n readonly [WRITABLE_BRAND] = true;\n\n constructor(initialValue: T, sync: boolean) {\n super();\n this._value = initialValue;\n\n if (sync) {\n this.flags |= ATOM_STATE_FLAGS.SYNC;\n }\n\n debug.attachDebugInfo(this, 'atom', this.id);\n }\n\n /** @internal */\n get isNotificationScheduled(): boolean {\n return (this.flags & ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED) !== 0;\n }\n\n /** @internal */\n get isSync(): boolean {\n return (this.flags & ATOM_STATE_FLAGS.SYNC) !== 0;\n }\n\n get value(): T {\n const ctx = trackingContext.current;\n if (ctx != null) {\n ctx.addDependency(this);\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 // 1. Double check: schedule pending or no slots\n if ((flags & ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED) !== 0) return;\n\n const slots = this._slots;\n if (slots == null || slots.size === 0) return;\n\n this._pendingOldValue = oldValue;\n this.flags = flags | ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED;\n\n // 2. Schedule or flush (inline bitwise)\n if ((flags & ATOM_STATE_FLAGS.SYNC) !== 0 && !scheduler.isBatching) {\n this._flushNotifications();\n } else {\n scheduler.schedule(this);\n }\n }\n\n /**\n * Executes scheduled notification.\n * @internal\n */\n execute(): void {\n this._flushNotifications();\n }\n\n /**\n * Triggers subscribers.\n */\n private _flushNotifications(): void {\n const flags = this.flags;\n // Guard: Combined bitwise check for NOTIFICATION_SCHEDULED and not DISPOSED\n if (\n (flags & (ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED | ATOM_STATE_FLAGS.DISPOSED)) !==\n ATOM_STATE_FLAGS.NOTIFICATION_SCHEDULED\n ) {\n return;\n }\n\n const oldValue = this._pendingOldValue as T;\n this._pendingOldValue = undefined;\n this.flags = 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 const flags = this.flags;\n if ((flags & ATOM_STATE_FLAGS.DISPOSED) !== 0) return;\n\n this._slots?.clear();\n this.flags = flags | ATOM_STATE_FLAGS.DISPOSED;\n // Release references\n this._value = undefined as T;\n this._pendingOldValue = undefined;\n }\n\n protected override _deepDirtyCheck(): boolean {\n return false;\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 { BITPACK } from '@/constants';\nimport type { DependencyLink } from '@/core/dep-tracking';\nimport type { Dependency } from '@/types';\nimport { SlotBuffer } from './slot-buffer';\n\n/**\n * Specialized inline-slot container for dependency tracking.\n *\n * Inherits from `SlotBuffer` to share the same zero-allocation inline\n * properties (`_s0`...`_s3`). Adds dependency-specific in-place updates,\n * truncation, and a hybrid O(1) Map fallback for mega-node performance.\n */\nexport class DepSlotBuffer extends SlotBuffer<DependencyLink> {\n private _map: Map<Dependency, number> | null = null;\n private readonly _SCAN_THRESHOLD = 32;\n\n /**\n * Indicates if the buffer contains at least one computed dependency.\n */\n hasComputeds = false;\n\n /**\n * Cached dependency version snapshot hash.\n */\n _depsHash = 0;\n\n /**\n * Resets tracking metadata for a new evaluation pass.\n * Ensures 'hasComputeds' is clean.\n */\n prepareTracking(): void {\n this.hasComputeds = false;\n }\n\n /**\n * Protected hook called whenever a link is extracted from the buffer.\n * Handles automatic unsubscription without closure allocation.\n */\n protected override _onItemRemoved(link: DependencyLink): void {\n const unsub = link.unsub;\n if (unsub) unsub();\n }\n\n /**\n * Looks for an existing subscription to the given node starting from `trackIndex`.\n * If found, swaps it to `trackIndex`, updates version, and returns true.\n */\n claimExisting(dep: Dependency, trackIndex: number): boolean {\n const count = this._count;\n if (trackIndex >= count) return false;\n\n // 1. Hybrid O(1) Map Fallback for Mega-Nodes\n const remaining = count - trackIndex;\n if (this._map !== null || remaining > this._SCAN_THRESHOLD) {\n return this._claimViaMap(dep, trackIndex);\n }\n\n // 2. Unrolled Fast Path for Inline Slots (0..3)\n // Avoids overhead of getAt/setAt by using switch-fallthrough and direct access.\n if (trackIndex < 4) {\n switch (trackIndex) {\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for sequential search\n case 0: {\n const l = this._s0;\n if (l && l.node === dep && l.unsub) {\n l.version = dep.version;\n return true;\n }\n }\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for sequential search\n case 1: {\n if (count > 1) {\n const l = this._s1;\n if (l && l.node === dep && l.unsub) {\n l.version = dep.version;\n if (trackIndex !== 1) {\n // we know trackIndex is 0 here\n this._s1 = this._s0;\n this._s0 = l;\n }\n return true;\n }\n }\n }\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for sequential search\n case 2: {\n if (count > 2) {\n const l = this._s2;\n if (l && l.node === dep && l.unsub) {\n l.version = dep.version;\n if (trackIndex !== 2) {\n // swap with trackIndex (0 or 1)\n const occ = trackIndex === 0 ? this._s0 : this._s1;\n if (trackIndex === 0) this._s0 = l;\n else this._s1 = l;\n this._s2 = occ;\n }\n return true;\n }\n }\n }\n case 3: {\n if (count > 3) {\n const l = this._s3;\n if (l && l.node === dep && l.unsub) {\n l.version = dep.version;\n if (trackIndex !== 3) {\n // swap with trackIndex (0, 1, or 2)\n let occ: DependencyLink | null;\n if (trackIndex === 0) {\n occ = this._s0;\n this._s0 = l;\n } else if (trackIndex === 1) {\n occ = this._s1;\n this._s1 = l;\n } else {\n occ = this._s2;\n this._s2 = l;\n }\n this._s3 = occ;\n }\n return true;\n }\n }\n }\n }\n }\n\n // 3. Sequential Scan for Overflow\n const ov = this._overflow;\n if (ov) {\n const dv = dep.version;\n const start = trackIndex > 4 ? trackIndex : 4;\n const len = ov.length;\n for (let i = start - 4; i < len; i++) {\n const link = ov[i];\n if (link && link.node === dep && link.unsub) {\n link.version = dv;\n this._swapGeneral(i + 4, trackIndex, link);\n return true;\n }\n }\n }\n\n return false;\n }\n\n private _claimViaMap(dep: Dependency, trackIndex: number): boolean {\n let map = this._map;\n if (map === null) {\n map = this._map = new Map();\n const count = this._count;\n // Partitioned scan to avoid getAt() dispatch in loop\n if (trackIndex < 4) {\n const s0 = this._s0;\n if (trackIndex <= 0 && s0?.unsub) map.set(s0.node, 0);\n const s1 = this._s1;\n if (trackIndex <= 1 && s1?.unsub) map.set(s1.node, 1);\n const s2 = this._s2;\n if (trackIndex <= 2 && s2?.unsub) map.set(s2.node, 2);\n const s3 = this._s3;\n if (trackIndex <= 3 && s3?.unsub) map.set(s3.node, 3);\n }\n const ov = this._overflow;\n if (ov && count > 4) {\n const start = trackIndex > 4 ? trackIndex : 4;\n const len = ov.length;\n for (let i = start - 4; i < len; i++) {\n const link = ov[i];\n if (link?.unsub) map.set(link.node, i + 4);\n }\n }\n }\n\n const existingIndex = map.get(dep);\n if (existingIndex === undefined || existingIndex < trackIndex) return false;\n\n const link = this.getAt(existingIndex);\n if (link == null || !link.unsub) return false;\n\n link.version = dep.version;\n if (existingIndex !== trackIndex) {\n // Inlined swap to avoid dispatch overhead\n let occupant: DependencyLink | null;\n if (trackIndex === 0) occupant = this._s0;\n else if (trackIndex === 1) occupant = this._s1;\n else if (trackIndex === 2) occupant = this._s2;\n else if (trackIndex === 3) occupant = this._s3;\n else occupant = this._overflow![trackIndex - 4] ?? null;\n\n this.setAt(trackIndex, link);\n this.setAt(existingIndex, occupant);\n\n if (occupant?.unsub) map.set(occupant.node, existingIndex);\n map.set(dep, trackIndex);\n }\n return true;\n }\n\n private _swapGeneral(idx: number, trackIndex: number, link: DependencyLink): void {\n if (idx === trackIndex) return;\n\n // Use direct access for the likely case where idx is in overflow\n let occupant: DependencyLink | null;\n if (trackIndex === 0) occupant = this._s0;\n else if (trackIndex === 1) occupant = this._s1;\n else if (trackIndex === 2) occupant = this._s2;\n else if (trackIndex === 3) occupant = this._s3;\n else occupant = this._overflow![trackIndex - 4] ?? null;\n\n this.setAt(trackIndex, link);\n\n if (idx === 0) this._s0 = occupant;\n else if (idx === 1) this._s1 = occupant;\n else if (idx === 2) this._s2 = occupant;\n else if (idx === 3) this._s3 = occupant;\n else {\n const ov = this._overflow!;\n ov[idx - 4] = occupant;\n }\n }\n\n insertNew(trackIndex: number, link: DependencyLink): void {\n const count = this._count;\n if (trackIndex < count) {\n let occupant: DependencyLink | null;\n if (trackIndex === 0) occupant = this._s0;\n else if (trackIndex === 1) occupant = this._s1;\n else if (trackIndex === 2) occupant = this._s2;\n else if (trackIndex === 3) occupant = this._s3;\n else occupant = this._overflow![trackIndex - 4] ?? null;\n\n if (occupant != null) {\n // Direct overflow append avoids inline gap-scan overhead in add()\n // since we know all inline slots are occupied when trackIndex < count.\n this._addToOverflow(occupant);\n if (this._map !== null && occupant.unsub) {\n this._map.set(occupant.node, this._count - 1);\n }\n }\n }\n\n if (trackIndex === 0) this._s0 = link;\n else if (trackIndex === 1) this._s1 = link;\n else if (trackIndex === 2) this._s2 = link;\n else if (trackIndex === 3) this._s3 = link;\n else {\n let ov = this._overflow;\n if (!ov) {\n ov = [];\n this._overflow = ov;\n }\n ov[trackIndex - 4] = link;\n }\n\n if (trackIndex >= count) {\n this._count = trackIndex + 1;\n }\n }\n\n /**\n * Discards all links from the given index onwards.\n * Unsubscribes each link before removing it.\n */\n truncateFrom(index: number): void {\n if (index >= this._count) return;\n\n super.truncateFrom(index);\n\n if (this._map !== null) {\n this._map.clear();\n this._map = null;\n }\n }\n\n /**\n * Seals the buffer after a tracking pass completes.\n * Computes the additive snapshot hash of all dependency versions.\n *\n * Uses link.version (snapshot at tracking time) — NOT node.version.\n */\n seal(): void {\n this._depsHash = this._calculateHash(false);\n }\n\n /**\n * Efficient O(N) fast-path dirty check using the sealed version hash.\n */\n isDirtyFast(): boolean {\n return this._calculateHash(true) !== this._depsHash;\n }\n\n private _calculateHash(isLive: boolean): number {\n const count = this._count;\n if (count === 0) return 0;\n\n const vbits = BITPACK.VERSION_BITS;\n let hash = 0;\n\n // Inline slots (unrolled)\n const s0 = this._s0;\n if (s0 != null) {\n const n0 = s0.node;\n const v0 = isLive ? n0.version : s0.version;\n hash = (hash + (v0 << vbits) + n0.id) | 0;\n\n const s1 = this._s1;\n if (count > 1 && s1 != null) {\n const n1 = s1.node;\n const v1 = isLive ? n1.version : s1.version;\n hash = (hash + (v1 << vbits) + n1.id) | 0;\n\n const s2 = this._s2;\n if (count > 2 && s2 != null) {\n const n2 = s2.node;\n const v2 = isLive ? n2.version : s2.version;\n hash = (hash + (v2 << vbits) + n2.id) | 0;\n\n const s3 = this._s3;\n if (count > 3 && s3 != null) {\n const n3 = s3.node;\n const v3 = isLive ? n3.version : s3.version;\n hash = (hash + (v3 << vbits) + n3.id) | 0;\n }\n }\n }\n }\n\n // Overflow\n if (count > 4) {\n const ov = this._overflow!;\n for (let i = 0, len = ov.length; i < len; i++) {\n const l = ov[i]!;\n const n = l.node;\n const v = isLive ? n.version : l.version;\n hash = (hash + (v << vbits) + n.id) | 0;\n }\n }\n\n return hash;\n }\n\n /** Unsubscribes from all links and resets the buffer. */\n disposeAll(): void {\n if (this._count > 0) {\n this.truncateFrom(0);\n }\n this.hasComputeds = false;\n }\n\n /**\n * [Safety Guard]\n * remove() is strictly prohibited in DepSlotBuffer to preserve sequential cache paths.\n */\n override remove(_item: DependencyLink): boolean {\n throw new Error(\n 'remove() is strictly prohibited in DepSlotBuffer to preserve sequential cache paths.'\n );\n }\n\n /**\n * [Safety Guard]\n * Compaction is unnecessary since remove() is prohibited.\n */\n override compact(): void {\n // No-op for DepSlotBuffer\n }\n}\n","import { ATOM_BRAND, COMPUTED_BRAND, EFFECT_BRAND, WRITABLE_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 typeof obj === 'object' && obj !== null && ATOM_BRAND in obj;\n}\n\n/**\n * Writable atom check.\n *\n * Uses a dedicated positive brand instead of `!isComputed()` to remain\n * correct if new ReadonlyAtom-style primitives are added in the future.\n */\nexport function isWritable(obj: unknown): obj is WritableAtom {\n return typeof obj === 'object' && obj !== null && WRITABLE_BRAND in obj;\n}\n\n/**\n * Computed atom check.\n */\nexport function isComputed(obj: unknown): obj is ComputedAtom {\n return typeof obj === 'object' && obj !== null && COMPUTED_BRAND in obj;\n}\n\n/**\n * Effect object check.\n */\nexport function isEffect(obj: unknown): obj is EffectObject {\n return typeof obj === 'object' && obj !== null && EFFECT_BRAND in obj;\n}\n\n/**\n * Promise check.\n */\nexport function isPromise<T>(value: unknown): value is Promise<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\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 EPOCH_CONSTANTS,\n IS_DEV,\n SMI_MAX,\n} from '@/constants';\nimport { ReactiveNode } from '@/core/base';\nimport { DependencyLink } from '@/core/dep-tracking';\nimport { ComputedError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport { DepSlotBuffer } from '@/internal/dep-slot-buffer';\nimport { currentFlushEpoch, nextEpoch, nextVersion } from '@/internal/epoch';\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 {\n IDLE,\n DIRTY,\n PENDING,\n RESOLVED,\n REJECTED,\n HAS_ERROR,\n RECOMPUTING,\n DISPOSED,\n IS_COMPUTED,\n FORCE_COMPUTE,\n} = COMPUTED_STATE_FLAGS;\n\n/**\n * Computed atom implementation.\n */\nclass ComputedAtomImpl<T> extends ReactiveNode<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 /** Initialized in constructor. Unified node property. */\n _deps = new DepSlotBuffer();\n\n // Async state\n\n private _asyncRetryCount = 0;\n private _lastDriftEpoch: number = EPOCH_CONSTANTS.UNINITIALIZED;\n\n // Dependency collection state\n private _trackEpoch: number = EPOCH_CONSTANTS.UNINITIALIZED;\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 this._maxAsyncRetries =\n (options.maxAsyncRetries ?? 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 /** @internal */\n get isDirty(): boolean {\n return (this.flags & DIRTY) !== 0;\n }\n\n /** @internal */\n get isRejected(): boolean {\n return (this.flags & REJECTED) !== 0;\n }\n\n /** @internal */\n get isRecomputing(): boolean {\n return (this.flags & RECOMPUTING) !== 0;\n }\n\n /** @internal */\n private get _hasErrorInternal(): boolean {\n return (this.flags & HAS_ERROR) !== 0;\n }\n\n private _track(): void {\n trackingContext.current?.addDependency(this);\n }\n\n get value(): T {\n const ctx = trackingContext.current;\n if (ctx != null) ctx.addDependency(this);\n\n let flags = this.flags;\n // 1. Fast path: Stable and Resolved\n if ((flags & (RESOLVED | DIRTY | IDLE)) === RESOLVED) {\n return this._value;\n }\n\n // 2. Exception paths\n if ((flags & DISPOSED) !== 0) throw new ComputedError(ERROR_MESSAGES.COMPUTED_DISPOSED);\n\n if ((flags & RECOMPUTING) !== 0) {\n const def = this._defaultValue;\n if (def !== (NO_DEFAULT_VALUE as T)) return def;\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_CIRCULAR_DEPENDENCY);\n }\n\n // 3. Evaluation path\n if ((flags & (DIRTY | IDLE)) !== 0) {\n const deps = this._deps;\n if (\n (flags & IDLE) === 0 &&\n (flags & FORCE_COMPUTE) === 0 &&\n deps.size > 0 &&\n !this._isDirty()\n ) {\n flags = this.flags &= ~DIRTY;\n } else {\n this._recompute();\n flags = this.flags;\n }\n if ((flags & RESOLVED) !== 0) return this._value;\n }\n\n // 4. Async/Error handling\n const def = this._defaultValue;\n const hasDefault = def !== (NO_DEFAULT_VALUE as T);\n\n if ((flags & PENDING) !== 0) {\n if (hasDefault) return def;\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n\n if ((flags & REJECTED) !== 0) {\n if (hasDefault) 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 const ctx = trackingContext.current;\n if (ctx != null) ctx.addDependency(this);\n const flags = this.flags;\n if ((flags & RESOLVED) !== 0) return AsyncState.RESOLVED;\n if ((flags & PENDING) !== 0) return AsyncState.PENDING;\n if ((flags & REJECTED) !== 0) return AsyncState.REJECTED;\n return AsyncState.IDLE;\n }\n\n get hasError(): boolean {\n const ctx = trackingContext.current;\n if (ctx != null) ctx.addDependency(this);\n\n const flags = this.flags;\n // Inlined checks for REJECTED | HAS_ERROR\n if ((flags & (REJECTED | HAS_ERROR)) !== 0) return true;\n\n const deps = this._deps;\n if (!deps.hasComputeds) return false;\n\n const size = deps.size;\n for (let i = 0; i < size; i++) {\n const link = deps.getAt(i);\n if (link?.node.hasError) return true;\n }\n return false;\n }\n\n get isValid(): boolean {\n return !this.hasError;\n }\n\n get errors(): readonly Error[] {\n const ctx = trackingContext.current;\n if (ctx != null) ctx.addDependency(this);\n\n const selfErr = this._error;\n const deps = this._deps;\n\n // Early exit: no computed dependencies means no bubbling errors\n if (!deps.hasComputeds) {\n if (selfErr == null) return EMPTY_ERROR_ARRAY;\n return Object.freeze([selfErr]);\n }\n\n const collected: Error[] = [];\n if (selfErr != null) collected.push(selfErr);\n\n const size = deps.size;\n for (let i = 0; i < size; i++) {\n const link = deps.getAt(i);\n if (link == null) continue;\n\n const dep = link.node;\n // Inlined isComputed + hasError check\n if ((dep.flags & IS_COMPUTED) !== 0 && dep.hasError) {\n this._collectErrorsFromDep(dep as unknown as ComputedAtom<unknown>, collected);\n }\n }\n\n return collected.length === 0 ? EMPTY_ERROR_ARRAY : Object.freeze(collected);\n }\n\n private _collectErrorsFromDep(computedDep: ComputedAtom<unknown>, collected: Error[]): void {\n const errs = computedDep.errors;\n const len = errs.length;\n for (let j = 0; j < len; j++) {\n const err = errs[j];\n if (err != null && !collected.includes(err)) {\n collected.push(err);\n }\n }\n }\n\n get lastError(): Error | null {\n const ctx = trackingContext.current;\n if (ctx != null) ctx.addDependency(this);\n return this._error;\n }\n\n get isPending(): boolean {\n const ctx = trackingContext.current;\n if (ctx != null) ctx.addDependency(this);\n return (this.flags & PENDING) !== 0;\n }\n\n get isResolved(): boolean {\n const ctx = trackingContext.current;\n if (ctx != null) ctx.addDependency(this);\n return (this.flags & RESOLVED) !== 0;\n }\n\n invalidate(): void {\n this.flags |= FORCE_COMPUTE;\n this._markDirty();\n }\n\n dispose(): void {\n const flags = this.flags;\n if ((flags & DISPOSED) !== 0) return;\n\n this._deps.disposeAll();\n\n if (this._slots != null) {\n this._slots.clear();\n }\n this.flags = DISPOSED | DIRTY | IDLE;\n\n // Release Memory\n this._error = null;\n this._value = undefined as T;\n this._hotIndex = -1;\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n addDependency(dep: Dependency): void {\n const trackEpoch = this._trackEpoch;\n if (dep._lastSeenEpoch === trackEpoch) return;\n dep._lastSeenEpoch = trackEpoch;\n\n const trackIndex = this._trackCount++;\n const deps = this._deps;\n const existing = deps.getAt(trackIndex);\n\n // 1. Stable Path: dependency index remains the same\n if (existing != null && existing.node === dep) {\n existing.version = dep.version;\n }\n // 2. Diverged Path: lookup or insert\n else if (deps.claimExisting(dep, trackIndex)) {\n // Version updated inside claimExisting\n }\n // 3. New dependency\n else {\n const link = new DependencyLink(dep, dep.version, dep.subscribe(this));\n deps.insertNew(trackIndex, link);\n }\n\n if ((dep.flags & IS_COMPUTED) !== 0) {\n deps.hasComputeds = true;\n }\n }\n\n private _recompute(): void {\n if (this.isRecomputing) return;\n this.flags = (this.flags | RECOMPUTING) & ~FORCE_COMPUTE;\n\n this._trackEpoch = nextEpoch();\n this._trackCount = 0;\n this._deps.prepareTracking();\n this._hotIndex = -1;\n\n let committed = false;\n try {\n // Execute function\n const result = trackingContext.run(this, this._fn);\n\n // Clean up any remaining trailing dependencies\n this._deps.truncateFrom(this._trackCount);\n this._deps.seal();\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 gracefully\n if (!committed) {\n try {\n this._deps.truncateFrom(this._trackCount);\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 // Reset transient state\n this._trackEpoch = EPOCH_CONSTANTS.UNINITIALIZED;\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._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 if (this._isDirty()) {\n // Reset retry counter when flush epoch changes — drifts across different\n // scheduler flushes are independent bursts, not a continuous failure streak.\n const epoch = currentFlushEpoch();\n if (this._lastDriftEpoch !== epoch) {\n this._lastDriftEpoch = epoch;\n this._asyncRetryCount = 0;\n }\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 _handleError(err: unknown, msg: string, throwErr = false): void {\n const error = wrapError(err, ComputedError, msg);\n\n if (!throwErr && !this.isRejected) {\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 const flags = this.flags;\n // Only bump version if value actually changed or first resolve\n if ((flags & RESOLVED) === 0 || !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 = (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 const flags = this.flags;\n if ((flags & (RECOMPUTING | DIRTY)) !== 0) return;\n this.flags = flags | DIRTY;\n this._notifySubscribers(undefined, undefined);\n }\n\n /**\n * Optimized dirty check. Bypasses deep scan if only Atoms are involved.\n */\n protected override _isDirty(): boolean {\n const deps = this._deps;\n if (deps.hasComputeds) return this._deepDirtyCheck();\n return deps.isDirtyFast();\n }\n\n /**\n * Deep dirty check for computations.\n */\n protected override _deepDirtyCheck(): boolean {\n const deps = this._deps;\n const prevContext = trackingContext.current;\n trackingContext.current = null;\n\n try {\n const size = deps.size;\n for (let i = 0; i < size; i++) {\n const link = deps.getAt(i);\n if (link == null) continue;\n\n const dep = link.node;\n // Inlined isComputed check\n if ((dep.flags & IS_COMPUTED) !== 0) {\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 }\n\n if (dep.version !== link.version) {\n this._hotIndex = i;\n return true;\n }\n }\n\n this._hotIndex = -1;\n return false;\n } finally {\n trackingContext.current = prevContext;\n }\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 DEBUG_CONFIG,\n EFFECT_STATE_FLAGS,\n EPOCH_CONSTANTS,\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 { DepSlotBuffer } from '@/internal/dep-slot-buffer';\nimport {\n currentFlushEpoch,\n flushExecutionCount,\n incrementFlushExecutionCount,\n nextEpoch,\n} from '@/internal/epoch';\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<void> implements EffectObject, DependencyTracker {\n /** @internal */\n readonly [EFFECT_BRAND] = true;\n\n private _cleanup: (() => void) | null = null;\n /** Initialized in constructor to maintain God Class object shape */\n _deps = new DepSlotBuffer();\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: number = EPOCH_CONSTANTS.UNINITIALIZED;\n private _lastFlushEpoch: number = EPOCH_CONSTANTS.UNINITIALIZED;\n private _executionsInEpoch: number;\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: number;\n private _windowStart: number;\n private _windowCount: number;\n private _execId: number;\n private _trackCount: number;\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\n this._executionsInEpoch = 0;\n this._executionCount = 0;\n this._windowStart = 0;\n this._windowCount = 0;\n this._execId = 0;\n this._trackCount = 0;\n\n // Pre-allocate callbacks once — eliminates per-dependency closure allocation\n if (this._sync) {\n this._notifyCallback = () => this.execute();\n } else {\n this._notifyCallback = () => scheduler.schedule(this);\n }\n\n debug.attachDebugInfo(this, 'effect', this.id);\n }\n\n public run(): void {\n if (this.isDisposed) {\n throw new EffectError(ERROR_MESSAGES.EFFECT_DISPOSED);\n }\n this.execute(true);\n }\n\n public dispose(): void {\n if (this.isDisposed) return;\n this.flags |= EFFECT_STATE_FLAGS.DISPOSED;\n\n this._execCleanup();\n this._deps?.disposeAll();\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n public addDependency(dep: Dependency): void {\n const flags = this.flags;\n if ((flags & EFFECT_STATE_FLAGS.EXECUTING) === 0) return;\n\n const startEpoch = this._currentEpoch;\n if (dep._lastSeenEpoch === startEpoch) return;\n dep._lastSeenEpoch = startEpoch;\n\n const trackIndex = this._trackCount++;\n const deps = this._deps;\n\n // Optimized: Direct access to inline slots for the hottest 4 dependencies\n let existing: DependencyLink | null;\n switch (trackIndex) {\n case 0:\n existing = deps._s0;\n break;\n case 1:\n existing = deps._s1;\n break;\n case 2:\n existing = deps._s2;\n break;\n case 3:\n existing = deps._s3;\n break;\n default:\n existing = deps.getAt(trackIndex);\n }\n\n // 1. Stable Path: dependency index remains the same\n if (existing != null && existing.node === dep) {\n existing.version = dep.version;\n }\n // 2. Diverged Path: lookup or insert\n else if (deps.claimExisting(dep, trackIndex)) {\n // Version updated in claimExisting\n }\n // 3. New dependency\n else {\n this._insertNewDependency(dep, trackIndex);\n }\n\n if (dep.isComputed) {\n deps.hasComputeds = true;\n }\n }\n\n private _insertNewDependency(dep: Dependency, trackIndex: number): void {\n let link: DependencyLink;\n try {\n const unsubscribe = dep.subscribe(this._notifyCallback);\n link = 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 link = new DependencyLink(dep, dep.version, undefined);\n }\n\n this._deps!.insertNew(trackIndex, link);\n }\n\n /**\n * Executes effect with tracking.\n */\n public execute(force = false): void {\n const flags = this.flags;\n // Guard: Combined bitwise check for efficiency\n if ((flags & (EFFECT_STATE_FLAGS.DISPOSED | EFFECT_STATE_FLAGS.EXECUTING)) !== 0) return;\n\n // Skip if not dirty or forced\n const deps = this._deps;\n if (!force && deps.size > 0 && !this._isDirty()) return;\n\n this._checkInfiniteLoops();\n\n this.flags = flags | EFFECT_STATE_FLAGS.EXECUTING;\n this._execCleanup();\n\n this._currentEpoch = nextEpoch();\n this._trackCount = 0;\n deps.prepareTracking();\n this._hotIndex = -1;\n\n let committed = false;\n try {\n const result = trackingContext.run(this, this._fn);\n\n // Clean up any remaining trailing dependencies\n deps.truncateFrom(this._trackCount);\n deps.seal();\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 gracefully to maintain state for recovery\n if (!committed) {\n try {\n deps.truncateFrom(this._trackCount);\n } catch (commitErr) {\n if (IS_DEV) {\n console.warn('[atom-effect] _commitDeps failed during error recovery:', commitErr);\n }\n }\n }\n this._handleExecutionError(error);\n this._cleanup = null;\n } finally {\n this.flags &= ~EFFECT_STATE_FLAGS.EXECUTING;\n }\n }\n\n /**\n * Optimized dirty check. Bypasses deep scan if only Atoms are involved.\n */\n protected override _isDirty(): boolean {\n const deps = this._deps;\n if (deps.hasComputeds) return this._deepDirtyCheck();\n return deps.isDirtyFast();\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.isDisposed) {\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 protected override _deepDirtyCheck(): boolean {\n const prevContext = trackingContext.current;\n trackingContext.current = null;\n const deps = this._deps!;\n\n try {\n const size = deps.size;\n for (let i = 0; i < size; i++) {\n const link = deps.getAt(i);\n if (link == null) continue;\n\n const dep = link.node;\n if (dep.isComputed) {\n this._tryPullComputed(dep);\n }\n\n if (dep.version !== link.version) {\n this._hotIndex = i;\n return true;\n }\n }\n return false;\n } finally {\n trackingContext.current = prevContext;\n }\n }\n\n private _tryPullComputed(dep: Dependency): void {\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 }\n }\n\n private _execCleanup(): void {\n const cleanup = this._cleanup;\n if (cleanup == null) return;\n this._cleanup = null;\n try {\n cleanup();\n } catch (error) {\n this._handleExecutionError(error, ERROR_MESSAGES.EFFECT_CLEANUP_FAILED);\n }\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 const executions = ++this._executionsInEpoch;\n if (executions > this._maxExecutionsPerFlush) this._throwInfiniteLoopError('per-effect');\n\n const globalExecutions = incrementFlushExecutionCount();\n if (globalExecutions > SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_FLUSH) {\n this._throwInfiniteLoopError('global');\n }\n\n this._executionCount++;\n\n if (IS_DEV) this._checkFrequencyLimit();\n }\n\n private _checkFrequencyLimit(): void {\n if (!Number.isFinite(this._maxExecutions)) return;\n\n const now = Date.now();\n if (now - this._windowStart >= DEBUG_CONFIG.EFFECT_FREQUENCY_WINDOW) {\n this._windowStart = now;\n this._windowCount = 1;\n return;\n }\n\n 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 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 { ERROR_MESSAGES } from '@/errors/messages';\nimport { 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 if (typeof fn !== 'function') {\n throw new TypeError(ERROR_MESSAGES.BATCH_CALLBACK_MUST_BE_FUNCTION);\n }\n\n const s = scheduler;\n s.startBatch();\n try {\n return fn();\n } finally {\n s.endBatch();\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@but212/atom-effect",
3
- "version": "0.26.0",
3
+ "version": "0.27.0",
4
4
  "type": "module",
5
5
  "description": "A reactive state management library that combines the power of `atom`, `computed`, and `effect` for seamless management of reactive state.",
6
6
  "main": "./dist/index.cjs",
@@ -41,14 +41,14 @@
41
41
  "devDependencies": {
42
42
  "@types/jsdom": "^28.0.1",
43
43
  "@types/node": "^25.5.0",
44
- "@vitest/coverage-v8": "^4.1.1",
45
- "@vitest/ui": "^4.1.1",
46
- "happy-dom": "^20.8.7",
44
+ "@vitest/coverage-v8": "^4.1.2",
45
+ "@vitest/ui": "^4.1.2",
46
+ "happy-dom": "^20.8.9",
47
47
  "jsdom": "^29.0.1",
48
48
  "tinybench": "^6.0.0",
49
- "vite": "^8.0.2",
49
+ "vite": "^8.0.3",
50
50
  "vite-plugin-dts": "^4.5.4",
51
- "vitest": "^4.1.1"
51
+ "vitest": "^4.1.2"
52
52
  },
53
53
  "scripts": {
54
54
  "build": "vite build",