@but212/atom-effect 0.3.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -83
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +16 -12
- package/dist/index.mjs +280 -253
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/constants.ts","../src/errors/errors.ts","../src/errors/messages.ts","../src/utils/debug.ts","../src/core/base/reactive-node.ts","../src/core/base/reactive-dependency.ts","../src/internal/epoch.ts","../src/internal/scheduler/scheduler.ts","../src/internal/scheduler/batch.ts","../src/tracking/context.ts","../src/tracking/untracked.ts","../src/utils/subscriber-manager.ts","../src/core/atom/atom.ts","../src/internal/pool.ts","../src/core/utils/dep-tracking.ts","../src/core/computed/index.ts","../src/core/effect/effect.ts","../src/utils/type-guards.ts"],"sourcesContent":["/**\n * @fileoverview Constants and configuration for atom-effect library\n * @description Centralized constants for async states, bit flags, and performance tuning\n */\n\n/**\n * Async computation states for computed atoms\n */\nexport const AsyncState = {\n IDLE: 'idle' as const,\n PENDING: 'pending' as const,\n RESOLVED: 'resolved' as const,\n REJECTED: 'rejected' as const,\n};\n\n/**\n * Bit flags for effect state management\n * Using bit flags for efficient state checks (O(1) operations)\n */\nexport const EFFECT_STATE_FLAGS = {\n DISPOSED: 1 << 0, // 0001 - Effect has been disposed\n EXECUTING: 1 << 1, // 0010 - Effect is currently executing\n} as const;\n\n/**\n * Bit flags for computed atom state management\n * Enables fast state transitions and checks without multiple boolean fields\n */\nexport const COMPUTED_STATE_FLAGS = {\n DIRTY: 1 << 0, // 0001 - Needs recomputation\n IDLE: 1 << 1, // 0010 - Initial state, not computed yet\n PENDING: 1 << 2, // 0100 - Async computation in progress\n RESOLVED: 1 << 3, // 1000 - Successfully computed\n REJECTED: 1 << 4, // 10000 - Computation failed\n RECOMPUTING: 1 << 5, // 100000 - Currently recomputing\n HAS_ERROR: 1 << 6, // 1000000 - Has error state\n} as const;\n\n/**\n * Object pool configuration\n * Controls memory management and GC pressure reduction\n */\nexport const POOL_CONFIG = {\n /** Maximum number of pooled objects to prevent memory bloat */\n MAX_SIZE: 1000,\n /** Number of objects to pre-allocate for performance-critical paths */\n WARMUP_SIZE: 100,\n} as const;\n\n/**\n * Scheduler configuration\n * Controls batching behavior and performance limits\n */\nexport const SCHEDULER_CONFIG = {\n /** Maximum effect executions per second to detect infinite loops (Legacy/Fallback) */\n MAX_EXECUTIONS_PER_SECOND: 100,\n /** Threshold for cleaning up old execution timestamps */\n CLEANUP_THRESHOLD: 100,\n\n /**\n * Maximum executions per effect within a single flush cycle\n * Increased from 10 to 50 based on evaluation report\n */\n MAX_EXECUTIONS_PER_EFFECT: 50,\n\n /**\n * Maximum total executions across all effects in a single flush cycle\n * Increased from 1000 to 5000 based on evaluation report\n */\n MAX_EXECUTIONS_PER_FLUSH: 5000,\n} as const;\n\n/**\n * Debug configuration defaults\n */\nexport const DEBUG_CONFIG = {\n /** Maximum dependencies before warning about large dependency graphs */\n MAX_DEPENDENCIES: 1000,\n /** Enable infinite loop detection warnings */\n WARN_INFINITE_LOOP: true,\n} as const;\n\n/**\n * Maximum Small Integer (Smi) value in V8 (31-bit signed integer)\n * Used for IDs and Versions to prevent HeapNumber allocation\n */\nexport const SMI_MAX = 0x3fffffff;\n\n/**\n * Environment detection\n */\nexport const IS_DEV =\n typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production';\n","/**\n * @fileoverview Error class hierarchy for atom-effect library\n * @description Structured error classes with cause tracking and recoverability flags\n */\n\n/**\n * Base error class for all atom-effect errors\n *\n * Provides enhanced error information including:\n * - Original cause tracking for error chains\n * - Recoverability flag for error handling strategies\n * - Timestamp for debugging and logging\n *\n * @example\n * ```ts\n * throw new AtomError('Invalid state', originalError, false);\n * ```\n */\nexport class AtomError extends Error {\n /** Original error that caused this error, if any */\n cause: Error | null;\n /** Whether this error can be recovered from */\n recoverable: boolean;\n /** When this error occurred */\n timestamp: Date;\n\n /**\n * Creates a new AtomError\n * @param message - Error message describing what went wrong\n * @param cause - Original error that caused this error\n * @param recoverable - Whether the operation can be retried\n */\n constructor(message: string, cause: Error | null = null, recoverable: boolean = true) {\n super(message);\n this.name = 'AtomError';\n this.cause = cause;\n this.recoverable = recoverable;\n this.timestamp = new Date();\n }\n}\n\n/**\n * Error thrown during computed value computation\n *\n * Computed errors are considered recoverable by default since they typically\n * result from transient data issues rather than programming errors.\n */\nexport class ComputedError extends AtomError {\n /**\n * Creates a new ComputedError\n * @param message - Error message\n * @param cause - Original error\n */\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, true);\n this.name = 'ComputedError';\n }\n}\n\n/**\n * Error thrown during effect execution\n *\n * Effect errors are considered non-recoverable by default since effects\n * typically represent critical side effects that shouldn't fail silently.\n */\nexport class EffectError extends AtomError {\n /**\n * Creates a new EffectError\n * @param message - Error message\n * @param cause - Original error\n */\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, false);\n this.name = 'EffectError';\n }\n}\n\n/**\n * Error thrown by the scheduler system\n *\n * Scheduler errors indicate fundamental issues with the batching/scheduling\n * mechanism and are considered non-recoverable.\n */\nexport class SchedulerError extends AtomError {\n /**\n * Creates a new SchedulerError\n * @param message - Error message\n * @param cause - Original error\n */\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, false);\n this.name = 'SchedulerError';\n }\n}\n\n/**\n * Wraps an unknown error in the appropriate AtomError subclass\n *\n * Provides consistent error handling by:\n * - Preserving original error information in the cause field\n * - Adding contextual information about where the error occurred\n * - Returning existing AtomErrors unchanged\n * - Handling various error types (TypeError, ReferenceError, etc.)\n *\n * @param error - Unknown error to wrap\n * @param ErrorClass - AtomError subclass to use for wrapping\n * @param context - Context string describing where the error occurred\n * @returns Wrapped error with contextual information\n *\n * @example\n * ```ts\n * try {\n * computeFn();\n * } catch (err) {\n * throw wrapError(err, ComputedError, 'computation phase');\n * }\n * ```\n */\nexport function wrapError(\n error: unknown,\n ErrorClass: typeof AtomError,\n context: string\n): AtomError {\n if (error instanceof TypeError) {\n return new ErrorClass(`Type error (${context}): ${error.message}`, error);\n }\n if (error instanceof ReferenceError) {\n return new ErrorClass(`Reference error (${context}): ${error.message}`, error);\n }\n if (error instanceof AtomError) {\n return error;\n }\n\n // Handle other error types\n const errorMessage = error instanceof Error ? error.message : String(error);\n const cause = error instanceof Error ? error : null;\n return new ErrorClass(`Unexpected error (${context}): ${errorMessage}`, cause);\n}\n\n/**\n * Type guard to check if a value is a Promise\n *\n * Uses duck-typing to detect Promise-like objects by checking for\n * the presence of a `then` method.\n *\n * @template T - The type the Promise resolves to\n * @param value - Value to check\n * @returns True if value has a `then` method (is Promise-like)\n *\n * @example\n * ```ts\n * const result = computeFn();\n * if (isPromise(result)) {\n * await result;\n * }\n * ```\n */\nexport function isPromise<T>(value: unknown): value is Promise<T> {\n return (\n value !== null &&\n value !== undefined &&\n typeof (value as { then?: unknown }).then === 'function'\n );\n}\n","/**\n * @fileoverview Centralized error messages for better maintainability\n * @description All error messages in English for international accessibility\n * @module errors/messages\n */\n\n/**\n * Centralized error message constants for the atom-effect library.\n *\n * @description\n * Provides consistent, maintainable error messages across the library.\n * All messages are in English for international accessibility.\n *\n * @remarks\n * - Computed errors: Related to computed atom creation and execution\n * - Atom errors: Related to atom subscription and notification\n * - Effect errors: Related to effect lifecycle and cleanup\n * - Debug warnings: Non-critical warnings for debugging\n *\n * @example\n * ```ts\n * import { ERROR_MESSAGES } from './messages';\n *\n * if (typeof fn !== 'function') {\n * throw new Error(ERROR_MESSAGES.COMPUTED_MUST_BE_FUNCTION);\n * }\n * ```\n */\nexport const ERROR_MESSAGES = {\n // ─────────────────────────────────────────────────────────────────\n // Computed errors\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Error thrown when computed() receives a non-function argument.\n */\n COMPUTED_MUST_BE_FUNCTION: 'Computed function must be a function',\n\n /**\n * Error thrown when subscribe() receives an invalid listener.\n */\n COMPUTED_SUBSCRIBER_MUST_BE_FUNCTION:\n 'Subscriber listener must be a function or Subscriber object',\n\n /**\n * Error thrown when accessing a pending async computed without a default value.\n */\n COMPUTED_ASYNC_PENDING_NO_DEFAULT: 'Async computation is pending. No default value provided',\n\n /**\n * Error thrown when a synchronous computed computation fails.\n */\n COMPUTED_COMPUTATION_FAILED: 'Computed computation failed',\n\n /**\n * Error thrown when an asynchronous computed computation fails.\n */\n COMPUTED_ASYNC_COMPUTATION_FAILED: 'Async computed computation failed',\n\n /**\n * Error thrown when subscribing to a dependency fails.\n */\n COMPUTED_DEPENDENCY_SUBSCRIPTION_FAILED: 'Failed to subscribe to dependency',\n\n // ─────────────────────────────────────────────────────────────────\n // Atom errors\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Error thrown when atom.subscribe() receives an invalid listener.\n */\n ATOM_SUBSCRIBER_MUST_BE_FUNCTION: 'Subscription listener must be a function or Subscriber object',\n\n /**\n * Error thrown when the atom subscriber notification process fails.\n */\n ATOM_SUBSCRIBER_EXECUTION_FAILED: 'Error occurred while executing atom subscribers',\n\n /**\n * Error logged when an individual subscriber throws during notification.\n * @remarks This error is caught and logged to prevent cascading failures.\n */\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: 'Error during individual atom subscriber execution',\n\n // ─────────────────────────────────────────────────────────────────\n // Effect errors\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Error thrown when effect() receives a non-function argument.\n */\n EFFECT_MUST_BE_FUNCTION: 'Effect function must be a function',\n\n /**\n * Error thrown when an effect's execution fails.\n */\n EFFECT_EXECUTION_FAILED: 'Effect execution failed',\n\n /**\n * Error thrown when an effect's cleanup function fails.\n */\n EFFECT_CLEANUP_FAILED: 'Effect cleanup function execution failed',\n\n // ─────────────────────────────────────────────────────────────────\n // Debug warnings\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Warning message for large dependency graphs.\n *\n * @param count - The number of dependencies detected\n * @returns Formatted warning message with dependency count\n *\n * @example\n * ```ts\n * console.warn(ERROR_MESSAGES.LARGE_DEPENDENCY_GRAPH(150));\n * // Output: \"Large dependency graph detected: 150 dependencies\"\n * ```\n */\n LARGE_DEPENDENCY_GRAPH: (count: number): string =>\n `Large dependency graph detected: ${count} dependencies`,\n\n /**\n * Warning logged when attempting to unsubscribe a non-existent listener.\n */\n UNSUBSCRIBE_NON_EXISTENT: 'Attempted to unsubscribe a non-existent listener',\n\n /**\n * Error logged when the onError callback itself throws an error.\n * @remarks This prevents cascading failures from masking the original error.\n */\n CALLBACK_ERROR_IN_ERROR_HANDLER: 'Error occurred during onError callback execution',\n} as const;\n","import { DEBUG_CONFIG } from '../constants';\nimport { ComputedError } from '../errors/errors';\nimport type { DebugConfig } from '../types';\n\n/** Symbol for debug display name on reactive objects */\nexport const DEBUG_NAME: unique symbol = Symbol('debugName');\n\n/** Symbol for unique identifier on reactive objects */\nexport const DEBUG_ID: unique symbol = Symbol('id');\n\n/** Symbol for type discriminator ('atom' | 'computed' | 'effect') */\nexport const DEBUG_TYPE: unique symbol = Symbol('type');\n\n/** Sentinel to distinguish \"no default\" from explicit `undefined` */\nexport const NO_DEFAULT_VALUE: unique symbol = Symbol('noDefaultValue');\n\nfunction hasDependencies(obj: unknown): obj is { dependencies: unknown[] } {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n 'dependencies' in obj &&\n Array.isArray((obj as { dependencies: unknown }).dependencies)\n );\n}\n\nlet globalCheckEpoch = 0;\n\nfunction checkCircularInternal(dep: unknown, current: unknown, epoch: number): void {\n const d = dep as { _visitedEpoch?: number };\n\n if (d._visitedEpoch === epoch) {\n return;\n }\n d._visitedEpoch = epoch;\n\n if (dep === current) {\n throw new ComputedError('Indirect circular dependency detected');\n }\n\n if (hasDependencies(dep)) {\n const deps = dep.dependencies;\n for (let i = 0; i < deps.length; i++) {\n checkCircularInternal(deps[i], current, epoch);\n }\n }\n}\n\n/**\n * Debug utilities for development-time dependency tracking and circular detection.\n * Most features only active when `NODE_ENV === 'development'`.\n */\nexport const debug: DebugConfig = {\n enabled:\n typeof process !== 'undefined' && (process as NodeJS.Process).env?.NODE_ENV === 'development',\n\n maxDependencies: DEBUG_CONFIG.MAX_DEPENDENCIES,\n\n warnInfiniteLoop: DEBUG_CONFIG.WARN_INFINITE_LOOP,\n\n warn(condition: boolean, message: string): void {\n if (this.enabled && condition) {\n console.warn(`[Atom Effect] ${message}`);\n }\n },\n\n /**\n * Checks for circular dependencies.\n * Direct check runs always; indirect check only in dev mode.\n * @throws {ComputedError} When circular dependency detected\n */\n checkCircular(dep: unknown, current: unknown, _unusedVisited?: unknown): void {\n if (dep === current) {\n throw new ComputedError('Direct circular dependency detected');\n }\n\n if (!this.enabled) {\n return;\n }\n\n globalCheckEpoch++;\n checkCircularInternal(dep, current, globalCheckEpoch);\n },\n\n attachDebugInfo(obj: object, type: string, id: number): void {\n if (!this.enabled) {\n return;\n }\n\n const target = obj as Record<symbol, unknown>;\n target[DEBUG_NAME] = `${type}_${id}`;\n target[DEBUG_ID] = id;\n target[DEBUG_TYPE] = type;\n },\n\n getDebugName(obj: unknown): string | undefined {\n if (obj !== null && typeof obj === 'object' && DEBUG_NAME in obj) {\n return (obj as Record<symbol, unknown>)[DEBUG_NAME] as string | undefined;\n }\n return undefined;\n },\n\n getDebugType(obj: unknown): string | undefined {\n if (obj !== null && typeof obj === 'object' && DEBUG_TYPE in obj) {\n return (obj as Record<symbol, unknown>)[DEBUG_TYPE] as string | undefined;\n }\n return undefined;\n },\n};\n\nlet nextId = 1;\n\n/** Generates a unique numeric ID for reactive objects */\nexport const generateId = (): number => nextId++;\n","import { SMI_MAX } from '../../constants';\nimport { generateId } from '../../utils/debug';\n\n/**\n * Base class for all reactive nodes (Atoms, Computed, Effects).\n *\n * Optimized for V8 hidden classes:\n * - Initializes Smi (Small Integer) fields first.\n * - Provides common identity and flag management.\n */\nexport class ReactiveNode {\n // === Smi Fields (Fixed Order for V8 Hidden Class) ===\n /** Unique numerical identifier (Smi) */\n readonly id: number;\n\n /** Internal flags (Smi) for state management (Disposed, Dirty, etc.) */\n flags: number;\n\n constructor() {\n this.id = generateId() & SMI_MAX;\n this.flags = 0;\n }\n}\n","import { AtomError } from '../../errors/errors';\nimport { ERROR_MESSAGES } from '../../errors/messages';\nimport type { Subscriber } from '../../types';\nimport type { SubscriberManager } from '../../utils/subscriber-manager';\nimport { ReactiveNode } from './reactive-node';\n\n/**\n * Abstract base class for reactive nodes that can be dependencies (Atom, Computed).\n *\n * Extends ReactiveNode with versioning and subscriber management.\n *\n * Performance Note:\n * Abstract accessors are used for subscriber managers to allow subclasses\n * to define the actual storage fields *after* their own Smi fields.\n * This ensures all Smi fields (from Base, Dependency, and Subclass) are\n * packed together at the start of the object for V8 optimization.\n */\nexport abstract class ReactiveDependency<T> extends ReactiveNode {\n // === Smi Fields (Continued from ReactiveNode) ===\n /** Version counter for change detection (Smi) */\n version: number;\n\n /** Last seen epoch for dependency collection (Smi) */\n _lastSeenEpoch: number;\n\n constructor() {\n super();\n this.version = 0;\n this._lastSeenEpoch = -1;\n }\n\n // === Abstract Accessors for Object Fields ===\n // Implemented by subclasses to control field layout\n protected abstract get _functionSubscribers(): SubscriberManager<\n (newValue?: T, oldValue?: T) => void\n >;\n protected abstract get _objectSubscribers(): SubscriberManager<Subscriber>;\n\n /**\n * Subscribes a listener function or Subscriber object to value changes.\n *\n * @param listener - Function or Subscriber object to call when the value changes\n * @returns An unsubscribe function\n * @throws {AtomError} If listener is not a function or Subscriber\n */\n subscribe(listener: ((newValue?: T, oldValue?: T) => void) | Subscriber): () => void {\n // Support Subscriber object for zero-allocation pattern\n if (typeof listener === 'object' && listener !== null && 'execute' in listener) {\n return this._objectSubscribers.add(listener);\n }\n\n if (typeof listener !== 'function') {\n throw new AtomError(ERROR_MESSAGES.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);\n }\n return this._functionSubscribers.add(listener);\n }\n\n /**\n * Gets the total number of active subscribers.\n */\n subscriberCount(): number {\n return this._functionSubscribers.size + this._objectSubscribers.size;\n }\n\n /**\n * Notifies all subscribers of a change.\n *\n * @param newValue - The new value\n * @param oldValue - The old value\n */\n protected _notifySubscribers(newValue: T | undefined, oldValue: T | undefined): void {\n this._functionSubscribers.forEachSafe(\n (sub) => sub(newValue, oldValue),\n (err) =>\n console.error(new AtomError(ERROR_MESSAGES.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED, err as Error))\n );\n\n this._objectSubscribers.forEachSafe(\n (sub) => sub.execute(),\n (err) =>\n console.error(new AtomError(ERROR_MESSAGES.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED, err as Error))\n );\n }\n}\n","import { IS_DEV, SMI_MAX } from '../constants';\n\nlet collectorEpoch = 0;\n\nexport function nextEpoch(): number {\n collectorEpoch = ((collectorEpoch + 1) | 0) & SMI_MAX;\n return collectorEpoch;\n}\n\nexport function currentEpoch(): number {\n return collectorEpoch;\n}\n\n// === Infinite Loop Detection State ===\n\nexport let flushEpoch = 0;\nexport let flushExecutionCount = 0;\nlet isFlushing = false;\n\nexport function startFlush(): boolean {\n if (isFlushing) {\n if (IS_DEV) {\n console.warn(\n 'Warning: startFlush() called during flush - ignored to prevent infinite loop detection bypass'\n );\n }\n return false;\n }\n\n isFlushing = true;\n flushEpoch = (flushEpoch + 1) & SMI_MAX;\n flushExecutionCount = 0;\n return true;\n}\n\nexport function endFlush(): void {\n isFlushing = false;\n}\n\nexport function incrementFlushExecutionCount(): number {\n if (!isFlushing) return 0;\n return ++flushExecutionCount;\n}\n\nexport function resetFlushState(): void {\n flushEpoch = 0;\n flushExecutionCount = 0;\n isFlushing = false;\n}\n","import { SchedulerError } from '../../errors/errors';\nimport { endFlush, startFlush } from '../epoch';\n\nexport enum SchedulerPhase {\n IDLE = 0,\n BATCHING = 1,\n FLUSHING = 2,\n}\n\nexport type SchedulerJob = (() => void) & { _nextEpoch?: number };\n\n/**\n * Scheduler for reactive updates with batching support.\n * Uses epoch-based O(1) deduplication and double buffering.\n */\nclass Scheduler {\n private queueA: SchedulerJob[] = [];\n private queueB: SchedulerJob[] = [];\n private queue: SchedulerJob[] = this.queueA;\n private queueSize = 0;\n private _epoch = 0;\n private isProcessing: boolean = false;\n public isBatching: boolean = false;\n private batchDepth: number = 0;\n private batchQueue: SchedulerJob[] = [];\n private batchQueueSize = 0;\n private isFlushingSync: boolean = false;\n private maxFlushIterations: number = 1000;\n\n get phase(): SchedulerPhase {\n if (this.isProcessing || this.isFlushingSync) {\n return SchedulerPhase.FLUSHING;\n }\n if (this.isBatching) {\n return SchedulerPhase.BATCHING;\n }\n return SchedulerPhase.IDLE;\n }\n\n schedule(callback: SchedulerJob): void {\n if (typeof callback !== 'function') {\n throw new SchedulerError('Scheduler callback must be a function');\n }\n\n // O(1) dedup via epoch\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 } else {\n this.queue[this.queueSize++] = callback;\n if (!this.isProcessing) {\n this.flush();\n }\n }\n }\n\n private flush(): void {\n if (this.isProcessing || this.queueSize === 0) return;\n\n this.isProcessing = true;\n\n const jobs = this.queue;\n const count = this.queueSize;\n\n this.queue = this.queue === this.queueA ? this.queueB : this.queueA;\n this.queueSize = 0;\n this._epoch++;\n\n queueMicrotask(() => {\n const flushStarted = startFlush();\n\n for (let i = 0; i < count; i++) {\n try {\n jobs[i]?.();\n } catch (error) {\n console.error(\n new SchedulerError('Error occurred during scheduler execution', error as Error)\n );\n }\n }\n\n jobs.length = 0;\n this.isProcessing = false;\n\n if (flushStarted) endFlush();\n\n if (this.queueSize > 0 && !this.isBatching) {\n this.flush();\n }\n });\n }\n\n private flushSync(): void {\n this.isFlushingSync = true;\n const flushStarted = startFlush();\n\n try {\n this._epoch++;\n\n if (this.batchQueueSize > 0) {\n for (let i = 0; i < this.batchQueueSize; i++) {\n const job = this.batchQueue[i]!;\n if (job._nextEpoch !== this._epoch) {\n job._nextEpoch = this._epoch;\n this.queue[this.queueSize++] = job;\n }\n }\n this.batchQueueSize = 0;\n }\n\n let iterations = 0;\n\n while (this.queueSize > 0) {\n if (++iterations > this.maxFlushIterations) {\n console.error(\n new SchedulerError(\n `Maximum flush iterations (${this.maxFlushIterations}) exceeded. Possible infinite loop.`\n )\n );\n this.queueSize = 0;\n this.queue.length = 0;\n this.batchQueueSize = 0;\n break;\n }\n\n const jobs = this.queue;\n const count = this.queueSize;\n\n this.queue = this.queue === this.queueA ? this.queueB : this.queueA;\n this.queueSize = 0;\n this._epoch++;\n\n for (let i = 0; i < count; i++) {\n try {\n jobs[i]?.();\n } catch (error) {\n console.error(\n new SchedulerError('Error occurred during batch execution', error as Error)\n );\n }\n }\n\n jobs.length = 0;\n\n if (this.batchQueueSize > 0) {\n for (let i = 0; i < this.batchQueueSize; i++) {\n this.queue[this.queueSize++] = this.batchQueue[i]!;\n }\n this.batchQueueSize = 0;\n }\n }\n } finally {\n this.isFlushingSync = false;\n if (flushStarted) endFlush();\n }\n }\n\n startBatch(): void {\n this.batchDepth++;\n this.isBatching = true;\n }\n\n endBatch(): void {\n this.batchDepth = Math.max(0, this.batchDepth - 1);\n\n if (this.batchDepth === 0) {\n this.flushSync();\n this.isBatching = false;\n }\n }\n\n setMaxFlushIterations(max: number): void {\n if (max < 10) {\n throw new SchedulerError('Max flush iterations must be at least 10');\n }\n this.maxFlushIterations = max;\n }\n}\n\nexport const scheduler = new Scheduler();\n","import { AtomError } from '../../errors/errors';\nimport { scheduler } from './scheduler';\n\n/**\n * Executes multiple reactive updates in a single batch.\n *\n * Batching groups multiple state changes together, deferring notifications\n * until all updates are complete. This prevents intermediate states from\n * triggering unnecessary recomputations and improves performance.\n *\n * @template T - The return type of the callback function\n * @param callback - The function containing batched updates\n * @returns The result of the callback function\n * @throws {AtomError} If the callback is not a function\n * @throws {AtomError} If an error occurs during batch execution\n *\n * @example\n * ```typescript\n * const firstName = atom('John');\n * const lastName = atom('Doe');\n *\n * // Without batching: triggers 2 separate updates\n * firstName.value = 'Jane';\n * lastName.value = 'Smith';\n *\n * // With batching: triggers 1 combined update\n * batch(() => {\n * firstName.value = 'Jane';\n * lastName.value = 'Smith';\n * });\n * ```\n */\nexport function batch<T>(callback: () => T): T {\n if (typeof callback !== 'function') {\n throw new AtomError('Batch callback must be a function');\n }\n\n scheduler.startBatch();\n\n try {\n return callback();\n } catch (error) {\n throw new AtomError('Error occurred during batch execution', error as Error);\n } finally {\n scheduler.endBatch();\n }\n}\n","import type { Listener } from './tracking.types';\n\n/** Interface for the tracking context managing dependency collection */\nexport interface TrackingContext {\n current: Listener | null;\n\n /** Executes fn within tracking context with given listener */\n run<T>(listener: Listener, fn: () => T): T;\n\n getCurrent(): Listener | null;\n}\n\n/**\n * Global tracking context for dependency collection.\n * Atoms register as dependencies when accessed within a tracked context.\n */\nexport const trackingContext: TrackingContext = {\n current: null,\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 getCurrent(): Listener | null {\n return this.current;\n },\n};\n","import { AtomError } from '../errors/errors';\nimport { trackingContext } from './context';\n\n/**\n * Executes a function without tracking any reactive dependencies.\n *\n * This utility allows reading atom values without establishing\n * a dependency relationship, useful for accessing values that\n * shouldn't trigger recomputation when they change.\n *\n * @template T - The return type of the function\n * @param fn - The function to execute without tracking\n * @returns The result of the executed function\n * @throws {AtomError} If the callback is not a function\n * @throws {AtomError} If an error occurs during execution\n *\n * @example\n * ```typescript\n * const count = atom(0);\n * const doubled = computed(() => {\n * // This read will NOT be tracked as a dependency\n * const untrackedValue = untracked(() => count.value);\n * return untrackedValue * 2;\n * });\n * ```\n */\nexport function untracked<T>(fn: () => T): T {\n if (typeof fn !== 'function') {\n throw new AtomError('Untracked callback must be a function');\n }\n\n const prev = trackingContext.current;\n trackingContext.current = null;\n\n try {\n return fn();\n } catch (error) {\n throw new AtomError('Error occurred during untracked execution', error as Error);\n } finally {\n trackingContext.current = prev;\n }\n}\n","/**\n * Manages subscribers with optimized array-based operations.\n * Uses linear search (cache-friendly for small arrays) + swap-and-pop removal.\n */\nexport class SubscriberManager<T> {\n private subscribers: T[] | null = null;\n\n /** Adds subscriber and returns unsubscribe function (idempotent) */\n add(subscriber: T): () => void {\n if (!this.subscribers) {\n this.subscribers = [];\n }\n\n if (this.subscribers.indexOf(subscriber) !== -1) {\n return () => {};\n }\n\n this.subscribers.push(subscriber);\n\n let isUnsubscribed = false;\n return () => {\n if (isUnsubscribed) return;\n isUnsubscribed = true;\n this.remove(subscriber);\n };\n }\n\n /** Removes subscriber using swap-and-pop */\n remove(subscriber: T): boolean {\n if (!this.subscribers) {\n return false;\n }\n\n const idx = this.subscribers.indexOf(subscriber);\n if (idx === -1) {\n return false;\n }\n\n const lastIndex = this.subscribers.length - 1;\n if (idx !== lastIndex) {\n this.subscribers[idx] = this.subscribers[lastIndex]!;\n }\n this.subscribers.pop();\n\n return true;\n }\n\n has(subscriber: T): boolean {\n if (!this.subscribers) return false;\n return this.subscribers.indexOf(subscriber) !== -1;\n }\n\n forEach(fn: (subscriber: T, index: number) => void): void {\n if (!this.subscribers) return;\n\n for (let i = 0; i < this.subscribers.length; i++) {\n fn(this.subscribers[i]!, i);\n }\n }\n\n /** Iterates with error handling to prevent one failure from breaking the chain */\n forEachSafe(fn: (subscriber: T, index: number) => void, onError?: (error: Error) => void): void {\n if (!this.subscribers) return;\n\n for (let i = 0; i < this.subscribers.length; i++) {\n try {\n fn(this.subscribers[i]!, i);\n } catch (error) {\n if (onError) {\n onError(error as Error);\n } else {\n console.error('[SubscriberManager] Error in subscriber callback:', error);\n }\n }\n }\n }\n\n get size(): number {\n return this.subscribers?.length ?? 0;\n }\n\n get hasSubscribers(): boolean {\n return this.size > 0;\n }\n\n clear(): void {\n this.subscribers = null;\n }\n\n toArray(): T[] {\n return this.subscribers ? [...this.subscribers] : [];\n }\n}\n","import { SMI_MAX } from '../../constants';\nimport { ReactiveDependency } from '../../core/base/reactive-dependency';\nimport { scheduler } from '../../internal/scheduler';\nimport { trackingContext } from '../../tracking';\nimport type { AtomOptions, Subscriber, WritableAtom } from '../../types';\nimport { debug } from '../../utils/debug';\nimport { SubscriberManager } from '../../utils/subscriber-manager';\n\n/** Internal WritableAtom implementation with optimized subscriber management */\nclass AtomImpl<T> extends ReactiveDependency<T> implements WritableAtom<T> {\n private _value: T;\n private readonly _functionSubscribersStore: SubscriberManager<\n (newValue?: T, oldValue?: T) => void\n >;\n private readonly _objectSubscribersStore: SubscriberManager<Subscriber>;\n private readonly _sync: boolean;\n private readonly _notifyTask: () => void;\n private _pendingOldValue: T | undefined;\n private _isNotificationScheduled: boolean = false;\n\n constructor(initialValue: T, sync: boolean) {\n super();\n this._value = initialValue;\n this._functionSubscribersStore = new SubscriberManager();\n this._objectSubscribersStore = new SubscriberManager();\n this._sync = sync;\n this._notifyTask = this._flushNotifications.bind(this);\n debug.attachDebugInfo(this, 'atom', this.id);\n }\n\n protected get _functionSubscribers(): SubscriberManager<(newValue?: T, oldValue?: T) => void> {\n return this._functionSubscribersStore;\n }\n\n protected get _objectSubscribers(): SubscriberManager<Subscriber> {\n return this._objectSubscribersStore;\n }\n\n /** Gets value and registers as dependency in current tracking context */\n get value(): T {\n const current = trackingContext.getCurrent();\n if (current !== null && current !== undefined) {\n this._track(current);\n }\n return this._value;\n }\n\n /** Sets value and notifies subscribers if changed (uses Object.is) */\n set value(newValue: T) {\n if (Object.is(this._value, newValue)) return;\n\n const oldValue = this._value;\n this.version = (this.version + 1) & SMI_MAX;\n const currentVersion = this.version;\n this._value = newValue;\n\n if (\n !this._functionSubscribersStore.hasSubscribers &&\n !this._objectSubscribersStore.hasSubscribers\n )\n return;\n\n this._notify(newValue, oldValue, currentVersion);\n }\n\n private _track(current: unknown): void {\n if (typeof current === 'function') {\n const fnWithDep = current as { addDependency?: (dep: unknown) => void };\n if (fnWithDep.addDependency !== undefined) {\n fnWithDep.addDependency(this);\n } else {\n this._functionSubscribersStore.add(current as (newValue?: T, oldValue?: T) => void);\n }\n } else {\n const tracker = current as { execute?: () => void; addDependency?: (dep: unknown) => void };\n if (tracker.addDependency !== undefined) {\n tracker.addDependency(this);\n } else if (tracker.execute !== undefined) {\n this._objectSubscribersStore.add(tracker as Subscriber);\n }\n }\n }\n\n private _notify(_newValue: T, oldValue: T, _currentVersion: number): void {\n if (!this._isNotificationScheduled) {\n this._pendingOldValue = oldValue;\n this._isNotificationScheduled = true;\n }\n\n if (this._sync && !scheduler.isBatching) {\n this._flushNotifications();\n } else {\n scheduler.schedule(this._notifyTask);\n }\n }\n\n private _flushNotifications(): void {\n if (!this._isNotificationScheduled) return;\n\n const oldValue = this._pendingOldValue as T;\n const newValue = this._value;\n\n this._pendingOldValue = undefined;\n this._isNotificationScheduled = false;\n\n this._notifySubscribers(newValue, oldValue);\n }\n\n /** Gets value without registering as dependency */\n peek(): T {\n return this._value;\n }\n\n dispose(): void {\n this._functionSubscribersStore.clear();\n this._objectSubscribersStore.clear();\n this._value = undefined as T;\n }\n}\n\n/**\n * Creates a reactive atom holding mutable state.\n * @param initialValue - Initial value\n * @param options - { sync?: boolean } for immediate notifications\n */\nexport function atom<T>(initialValue: T, options: AtomOptions = {}): WritableAtom<T> {\n return new AtomImpl(initialValue, options.sync ?? false);\n}\n","import { IS_DEV } from '@/constants';\nimport type { Dependency, Subscriber } from '../types';\nimport type { PoolStats } from '../types/internal';\n\n// Shared Constants\nexport const EMPTY_DEPS: readonly Dependency[] = Object.freeze([]);\nexport const EMPTY_SUBS: readonly Subscriber[] = Object.freeze([]);\nexport const EMPTY_UNSUBS: readonly (() => void)[] = Object.freeze([]);\n\nexport const EMPTY_VERSIONS: readonly number[] = Object.freeze([]);\n\n/**\n * Generic Array Pool (Type-safe pooling for different array types)\n */\nclass ArrayPool<T> {\n private pool: T[][] = [];\n private readonly maxPoolSize = 50;\n private readonly maxReusableCapacity = 256;\n\n private stats = IS_DEV\n ? {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 },\n }\n : null;\n\n acquire(): T[] {\n if (IS_DEV && this.stats) this.stats.acquired++;\n return this.pool.pop() ?? [];\n }\n\n release(arr: T[], emptyConst?: readonly T[]): void {\n // 1. Reference check first\n if (emptyConst && arr === emptyConst) return;\n\n // 2. Frozen check\n if (Object.isFrozen(arr)) {\n if (IS_DEV && this.stats) this.stats.rejected.frozen++;\n return;\n }\n\n // 3. Size check\n if (arr.length > this.maxReusableCapacity) {\n if (IS_DEV && this.stats) this.stats.rejected.tooLarge++;\n return;\n }\n\n // 4. Pool capacity check\n if (this.pool.length >= this.maxPoolSize) {\n if (IS_DEV && this.stats) this.stats.rejected.poolFull++;\n return;\n }\n\n // 5. Normal release\n arr.length = 0;\n this.pool.push(arr);\n if (IS_DEV && this.stats) this.stats.released++;\n }\n\n getStats(): PoolStats | null {\n if (!IS_DEV || !this.stats) return null;\n const { acquired, released, rejected } = this.stats;\n const totalRejected = rejected.frozen + rejected.tooLarge + rejected.poolFull;\n return {\n acquired,\n released,\n rejected,\n leaked: acquired - released - totalRejected,\n poolSize: this.pool.length,\n };\n }\n\n reset(): void {\n this.pool.length = 0;\n if (IS_DEV && this.stats) {\n this.stats.acquired = 0;\n this.stats.released = 0;\n this.stats.rejected = { frozen: 0, tooLarge: 0, poolFull: 0 };\n }\n }\n}\n\n// Per-type Pool Instances (V8 Shape Optimization)\nexport const depArrayPool = new ArrayPool<Dependency>();\nexport const subArrayPool = new ArrayPool<Subscriber>();\nexport const unsubArrayPool = new ArrayPool<() => void>();\nexport const versionArrayPool = new ArrayPool<number>();\n","import { EMPTY_DEPS, EMPTY_UNSUBS, unsubArrayPool } from '../../internal/pool';\nimport type { Dependency, Subscriber } from '../../types';\nimport { debug } from '../../utils/debug';\n\n/**\n * Synchronizes subscriptions based on dependency changes using O(N) strategy.\n * Maps unsubs 1:1 with dependencies array.\n *\n * Shared logic for Computed and Effect to manage their dependencies.\n *\n * @param nextDeps - The new list of dependencies collected\n * @param prevDeps - The previous list of dependencies\n * @param prevUnsubs - The previous list of unsubscribe functions\n * @param tracker - The object tracking these dependencies (Computed or Effect)\n * @returns The new list of unsubscribe functions\n */\nexport function syncDependencies(\n nextDeps: Dependency[],\n prevDeps: Dependency[],\n prevUnsubs: (() => void)[],\n tracker: Subscriber\n): (() => void)[] {\n // 1. Map existing subscriptions to dependencies for O(1) lookup during sync\n if (prevDeps !== EMPTY_DEPS && prevUnsubs !== EMPTY_UNSUBS) {\n for (let i = 0; i < prevDeps.length; i++) {\n const dep = prevDeps[i];\n if (dep) dep._tempUnsub = prevUnsubs[i];\n }\n }\n\n // 2. Build new unsubscribe array\n const nextUnsubs = unsubArrayPool.acquire();\n\n // Ensure nextUnsubs has same length as nextDeps\n nextUnsubs.length = nextDeps.length;\n\n for (let i = 0; i < nextDeps.length; i++) {\n const dep = nextDeps[i];\n if (!dep) continue;\n\n if (dep._tempUnsub) {\n // Reuse existing subscription\n nextUnsubs[i] = dep._tempUnsub;\n dep._tempUnsub = undefined; // Consumed\n } else {\n debug.checkCircular(dep, tracker);\n nextUnsubs[i] = dep.subscribe(tracker);\n }\n }\n\n // 3. Cleanup unused subscriptions (from removals)\n if (prevDeps !== EMPTY_DEPS) {\n for (let i = 0; i < prevDeps.length; i++) {\n const dep = prevDeps[i];\n if (dep?._tempUnsub) {\n // Still has _tempUnsub => was not reused in nextDeps => Removed\n dep._tempUnsub();\n dep._tempUnsub = undefined;\n }\n }\n }\n\n // 4. Release old unsub array\n if (prevUnsubs !== EMPTY_UNSUBS) {\n unsubArrayPool.release(prevUnsubs);\n }\n\n return nextUnsubs;\n}\n","import { AsyncState, COMPUTED_STATE_FLAGS, SMI_MAX } from '../../constants';\nimport { ReactiveDependency } from '../../core/base/reactive-dependency';\nimport { syncDependencies } from '../../core/utils/dep-tracking';\nimport type { AtomError } from '../../errors/errors';\nimport { ComputedError, isPromise, wrapError } from '../../errors/errors';\nimport { ERROR_MESSAGES } from '../../errors/messages';\nimport { nextEpoch } from '../../internal/epoch';\nimport {\n depArrayPool,\n EMPTY_DEPS,\n EMPTY_UNSUBS,\n EMPTY_VERSIONS,\n unsubArrayPool,\n versionArrayPool,\n} from '../../internal/pool';\nimport { trackingContext } from '../../tracking';\nimport type { DependencyTracker } from '../../tracking/tracking.types';\n\nimport type {\n AsyncStateType,\n ComputedAtom,\n ComputedOptions,\n Dependency,\n Subscriber,\n} from '../../types';\nimport { debug, NO_DEFAULT_VALUE } from '../../utils/debug';\nimport { SubscriberManager } from '../../utils/subscriber-manager';\n\ntype TrackableListener = (() => void) & {\n addDependency: (dep: unknown) => void;\n};\n\n/**\n * Computed atom with lazy evaluation, caching, and async support.\n * Uses bit flags for state and epoch-based dependency deduplication.\n */\nclass ComputedAtomImpl<T> extends ReactiveDependency<T> implements ComputedAtom<T>, Subscriber {\n private _value: T;\n private _error: AtomError | null;\n private _promiseId: number;\n private readonly _equal: (a: T, b: T) => boolean;\n\n private readonly _fn: () => T | Promise<T>;\n private readonly _defaultValue: T;\n private readonly _hasDefaultValue: boolean;\n private readonly _onError: ((error: Error) => void) | null;\n private readonly _functionSubscribersStore: SubscriberManager<\n (newValue?: T, oldValue?: T) => void\n >;\n private readonly _objectSubscribersStore: SubscriberManager<Subscriber>;\n private _dependencies: Dependency[];\n private _dependencyVersions: number[];\n private _unsubscribes: (() => void)[];\n\n private readonly _notifyJob: () => void;\n private readonly _trackable: TrackableListener;\n private readonly MAX_PROMISE_ID: number;\n\n constructor(fn: () => T | Promise<T>, options: ComputedOptions<T> = {}) {\n if (typeof fn !== 'function') {\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_MUST_BE_FUNCTION);\n }\n\n super();\n\n this._value = undefined as T;\n this.flags = COMPUTED_STATE_FLAGS.DIRTY | COMPUTED_STATE_FLAGS.IDLE;\n\n this._error = null;\n this._promiseId = 0;\n this._equal = options.equal ?? Object.is;\n\n this._fn = fn;\n this._defaultValue = 'defaultValue' in options ? options.defaultValue : (NO_DEFAULT_VALUE as T);\n this._hasDefaultValue = this._defaultValue !== (NO_DEFAULT_VALUE as T);\n this._onError = options.onError ?? null;\n this.MAX_PROMISE_ID = Number.MAX_SAFE_INTEGER - 1;\n\n this._functionSubscribersStore = new SubscriberManager<(newValue?: T, oldValue?: T) => void>();\n this._objectSubscribersStore = new SubscriberManager<Subscriber>();\n\n this._dependencies = EMPTY_DEPS as Dependency[];\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n this._unsubscribes = EMPTY_UNSUBS as (() => void)[];\n\n this._notifyJob = () => {\n this._functionSubscribersStore.forEachSafe(\n (subscriber) => subscriber(),\n (err) => console.error(err)\n );\n\n this._objectSubscribersStore.forEachSafe(\n (subscriber) => subscriber.execute(),\n (err) => console.error(err)\n );\n };\n\n this._trackable = Object.assign(() => this._markDirty(), {\n addDependency: (_dep: unknown) => {},\n });\n\n debug.attachDebugInfo(this as unknown as ComputedAtom<T>, 'computed', this.id);\n\n if (debug.enabled) {\n const debugObj = this as unknown as ComputedAtom<T> & {\n subscriberCount: () => number;\n isDirty: () => boolean;\n dependencies: Dependency[];\n stateFlags: string;\n };\n debugObj.subscriberCount = () =>\n this._functionSubscribersStore.size + this._objectSubscribersStore.size;\n debugObj.isDirty = () => this._isDirty();\n debugObj.dependencies = this._dependencies;\n debugObj.stateFlags = this._getFlagsAsString();\n }\n\n if (options.lazy === false) {\n try {\n this._recompute();\n } catch {\n // Ignore initial computation failure\n }\n }\n }\n\n protected get _functionSubscribers(): SubscriberManager<(newValue?: T, oldValue?: T) => void> {\n return this._functionSubscribersStore;\n }\n\n protected get _objectSubscribers(): SubscriberManager<Subscriber> {\n return this._objectSubscribersStore;\n }\n\n get value(): T {\n const result = this._computeValue();\n this._registerTracking();\n return result;\n }\n\n peek(): T {\n return this._value;\n }\n\n get state(): AsyncStateType {\n return this._getAsyncState();\n }\n\n get hasError(): boolean {\n return this._isRejected();\n }\n\n get lastError(): Error | null {\n return this._error;\n }\n\n get isPending(): boolean {\n return this._isPending();\n }\n\n get isResolved(): boolean {\n return this._isResolved();\n }\n\n invalidate(): void {\n this._markDirty();\n if (this._dependencyVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(this._dependencyVersions);\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n }\n }\n\n dispose(): void {\n if (this._unsubscribes !== EMPTY_UNSUBS) {\n for (let i = 0; i < this._unsubscribes.length; i++) {\n const unsub = this._unsubscribes[i];\n if (unsub) unsub();\n }\n unsubArrayPool.release(this._unsubscribes);\n this._unsubscribes = EMPTY_UNSUBS as (() => void)[];\n }\n\n if (this._dependencies !== EMPTY_DEPS) {\n depArrayPool.release(this._dependencies);\n this._dependencies = EMPTY_DEPS as Dependency[];\n }\n\n if (this._dependencyVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(this._dependencyVersions);\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n }\n\n this._functionSubscribersStore.clear();\n this._objectSubscribersStore.clear();\n this.flags = COMPUTED_STATE_FLAGS.DIRTY | COMPUTED_STATE_FLAGS.IDLE;\n this._error = null;\n this._value = undefined as T;\n this._promiseId = (this._promiseId + 1) % this.MAX_PROMISE_ID;\n }\n\n // State flag operations\n private _isDirty(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.DIRTY) !== 0;\n }\n\n private _setDirty(): void {\n this.flags |= COMPUTED_STATE_FLAGS.DIRTY;\n }\n\n private _clearDirty(): void {\n this.flags &= ~COMPUTED_STATE_FLAGS.DIRTY;\n }\n\n private _isIdle(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.IDLE) !== 0;\n }\n\n private _setIdle(): void {\n this.flags |= COMPUTED_STATE_FLAGS.IDLE;\n this.flags &= ~(\n COMPUTED_STATE_FLAGS.PENDING |\n COMPUTED_STATE_FLAGS.RESOLVED |\n COMPUTED_STATE_FLAGS.REJECTED\n );\n }\n\n private _isPending(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.PENDING) !== 0;\n }\n\n private _setPending(): void {\n this.flags |= COMPUTED_STATE_FLAGS.PENDING;\n this.flags &= ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.RESOLVED |\n COMPUTED_STATE_FLAGS.REJECTED\n );\n }\n\n private _isResolved(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.RESOLVED) !== 0;\n }\n\n private _setResolved(): void {\n this.flags |= COMPUTED_STATE_FLAGS.RESOLVED;\n this.flags &= ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.PENDING |\n COMPUTED_STATE_FLAGS.REJECTED |\n COMPUTED_STATE_FLAGS.HAS_ERROR\n );\n }\n\n private _isRejected(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.REJECTED) !== 0;\n }\n\n private _setRejected(): void {\n this.flags |= COMPUTED_STATE_FLAGS.REJECTED | COMPUTED_STATE_FLAGS.HAS_ERROR;\n this.flags &= ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.PENDING |\n COMPUTED_STATE_FLAGS.RESOLVED\n );\n }\n\n private _isRecomputing(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.RECOMPUTING) !== 0;\n }\n\n private _setRecomputing(value: boolean): void {\n const mask = COMPUTED_STATE_FLAGS.RECOMPUTING;\n this.flags = (this.flags & ~mask) | (-Number(value) & mask);\n }\n\n private _getAsyncState(): AsyncStateType {\n if (this._isPending()) return AsyncState.PENDING;\n if (this._isResolved()) return AsyncState.RESOLVED;\n if (this._isRejected()) return AsyncState.REJECTED;\n return AsyncState.IDLE;\n }\n\n private _getFlagsAsString(): string {\n const states: string[] = [];\n if (this._isDirty()) states.push('DIRTY');\n if (this._isIdle()) states.push('IDLE');\n if (this._isPending()) states.push('PENDING');\n if (this._isResolved()) states.push('RESOLVED');\n if (this._isRejected()) states.push('REJECTED');\n if (this._isRecomputing()) states.push('RECOMPUTING');\n return states.join(' | ');\n }\n\n private _computeValue(): T {\n if (this._isRecomputing()) return this._value;\n\n if (this._isDirty() || this._isIdle()) {\n this._recompute();\n }\n\n if (this._isPending()) return this._handlePending();\n if (this._isRejected()) return this._handleRejected();\n\n return this._value;\n }\n\n private _recompute(): void {\n if (this._isRecomputing()) return;\n\n this._setRecomputing(true);\n\n const prevDeps = this._dependencies;\n const prevVersions = this._dependencyVersions;\n const nextDeps = depArrayPool.acquire();\n const nextVersions = versionArrayPool.acquire();\n const epoch = nextEpoch();\n\n let depCount = 0;\n\n const collect = (dep: Dependency) => {\n if (dep._lastSeenEpoch === epoch) return;\n dep._lastSeenEpoch = epoch;\n\n if (depCount < nextDeps.length) {\n nextDeps[depCount] = dep;\n nextVersions[depCount] = dep.version;\n } else {\n nextDeps.push(dep);\n nextVersions.push(dep.version);\n }\n depCount++;\n };\n\n const originalAdd = this._trackable.addDependency;\n this._trackable.addDependency = collect as (dep: unknown) => void;\n\n let committed = false;\n\n try {\n const result = trackingContext.run(this._trackable, this._fn);\n\n nextDeps.length = depCount;\n nextVersions.length = depCount;\n\n if (isPromise(result)) {\n this._unsubscribes = syncDependencies(nextDeps, prevDeps, this._unsubscribes, this);\n this._dependencies = nextDeps;\n this._dependencyVersions = nextVersions;\n committed = true;\n\n this._handleAsyncComputation(result);\n this._setRecomputing(false);\n return;\n }\n\n this._unsubscribes = syncDependencies(nextDeps, prevDeps, this._unsubscribes, this);\n this._dependencies = nextDeps;\n this._dependencyVersions = nextVersions;\n committed = true;\n\n this._handleSyncResult(result);\n } catch (err) {\n nextDeps.length = depCount;\n nextVersions.length = depCount;\n this._unsubscribes = syncDependencies(nextDeps, prevDeps, this._unsubscribes, this);\n this._dependencies = nextDeps;\n this._dependencyVersions = nextVersions;\n committed = true;\n\n this._handleComputationError(err);\n } finally {\n this._trackable.addDependency = originalAdd;\n\n if (committed) {\n if (prevDeps !== EMPTY_DEPS) {\n depArrayPool.release(prevDeps as Dependency[]);\n }\n if (prevVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(prevVersions);\n }\n } else {\n depArrayPool.release(nextDeps);\n versionArrayPool.release(nextVersions);\n }\n }\n }\n\n private _handleSyncResult(result: T): void {\n const valueChanged = !this._isResolved() || !this._equal(this._value, result);\n if (valueChanged) {\n this.version = (this.version + 1) & SMI_MAX;\n }\n\n this._value = result;\n this._clearDirty();\n this._setResolved();\n this._error = null;\n this._setRecomputing(false);\n }\n\n private _handleAsyncComputation(promise: Promise<T>): void {\n this._setPending();\n this._clearDirty();\n\n this._promiseId = this._promiseId >= this.MAX_PROMISE_ID ? 1 : this._promiseId + 1;\n const promiseId = this._promiseId;\n\n promise\n .then((resolvedValue) => {\n if (promiseId !== this._promiseId) return;\n this._handleAsyncResolution(resolvedValue);\n })\n .catch((err) => {\n if (promiseId !== this._promiseId) return;\n this._handleAsyncRejection(err);\n });\n }\n\n private _handleAsyncResolution(resolvedValue: T): void {\n const valueChanged = !this._isResolved() || !this._equal(this._value, resolvedValue);\n if (valueChanged) {\n this.version = (this.version + 1) & SMI_MAX;\n }\n\n this._value = resolvedValue;\n this._clearDirty();\n this._setResolved();\n this._error = null;\n this._setRecomputing(false);\n }\n\n private _handleAsyncRejection(err: unknown): void {\n const error = wrapError(err, ComputedError, ERROR_MESSAGES.COMPUTED_ASYNC_COMPUTATION_FAILED);\n\n this._error = error;\n this._setRejected();\n this._clearDirty();\n this._setRecomputing(false);\n\n if (this._onError && typeof this._onError === 'function') {\n try {\n this._onError(error);\n } catch (callbackError) {\n console.error(ERROR_MESSAGES.CALLBACK_ERROR_IN_ERROR_HANDLER, callbackError);\n }\n }\n\n this._notifySubscribers(undefined, undefined);\n }\n\n private _handleComputationError(err: unknown): never {\n const error = wrapError(err, ComputedError, ERROR_MESSAGES.COMPUTED_COMPUTATION_FAILED);\n\n this._error = error;\n this._setRejected();\n this._clearDirty();\n this._setRecomputing(false);\n\n if (this._onError && typeof this._onError === 'function') {\n try {\n this._onError(error);\n } catch (callbackError) {\n console.error(ERROR_MESSAGES.CALLBACK_ERROR_IN_ERROR_HANDLER, callbackError);\n }\n }\n\n throw error;\n }\n\n private _handlePending(): T {\n if (this._hasDefaultValue) {\n return this._defaultValue;\n }\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n\n private _handleRejected(): T {\n if (this._error?.recoverable && this._hasDefaultValue) {\n return this._defaultValue;\n }\n throw this._error;\n }\n\n /** Subscriber interface - marks dirty on dependency change */\n execute(): void {\n this._markDirty();\n }\n\n private _markDirty(): void {\n if (this._isRecomputing() || this._isDirty()) return;\n\n this._setDirty();\n this._notifyJob();\n }\n\n private _registerTracking(): void {\n const current = trackingContext.getCurrent();\n if (!current) return;\n\n if (\n typeof current === 'object' &&\n current !== null &&\n (current as DependencyTracker).addDependency\n ) {\n (current as DependencyTracker).addDependency!(this as unknown as ComputedAtom<T>);\n } else if (typeof current === 'function') {\n const fnWithDep = current as TrackableListener;\n if (fnWithDep.addDependency) {\n fnWithDep.addDependency(this as unknown as ComputedAtom<T>);\n } else {\n this._functionSubscribersStore.add(current as () => void);\n }\n } else if ((current as DependencyTracker).execute) {\n this._objectSubscribersStore.add(current as Subscriber);\n }\n }\n}\n\nObject.freeze(ComputedAtomImpl.prototype);\n\n/**\n * Creates a computed value with automatic dependency tracking.\n * Supports sync/async computations with caching and lazy evaluation.\n * @param fn - Computation function (sync or async)\n * @param options - { equal?, defaultValue?, onError?, lazy? }\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) as unknown as ComputedAtom<T>;\n}\n","import { EFFECT_STATE_FLAGS, IS_DEV, SCHEDULER_CONFIG } from '../../constants';\nimport { ReactiveNode } from '../../core/base/reactive-node';\nimport { EffectError, isPromise, wrapError } from '../../errors/errors';\nimport { ERROR_MESSAGES } from '../../errors/messages';\nimport {\n flushEpoch,\n flushExecutionCount,\n incrementFlushExecutionCount,\n nextEpoch,\n} from '../../internal/epoch';\nimport {\n depArrayPool,\n EMPTY_DEPS,\n EMPTY_UNSUBS,\n EMPTY_VERSIONS,\n unsubArrayPool,\n versionArrayPool,\n} from '../../internal/pool';\nimport { scheduler } from '../../internal/scheduler';\nimport { type DependencyTracker, trackingContext, untracked } from '../../tracking';\nimport type { Dependency, EffectFunction, EffectObject, EffectOptions } from '../../types';\nimport { debug } from '../../utils/debug';\n\n/** Internal effect implementation with dependency tracking and infinite loop detection */\nclass EffectImpl extends ReactiveNode implements EffectObject, DependencyTracker {\n private _currentEpoch: number;\n private _lastFlushEpoch: number;\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 private readonly _trackModifications: boolean;\n\n private _cleanup: (() => void) | null;\n private _dependencies: Dependency[];\n private _dependencyVersions: number[];\n private _unsubscribes: (() => void)[];\n private _nextDeps: Dependency[] | null;\n private _nextVersions: number[] | null;\n private _nextUnsubs: (() => void)[] | null;\n private _history: number[] | null;\n private _executionCount: number;\n\n constructor(fn: EffectFunction, options: EffectOptions = {}) {\n super();\n\n this._currentEpoch = -1;\n this._lastFlushEpoch = -1;\n this._executionsInEpoch = 0;\n\n this._fn = fn;\n this._sync = options.sync ?? false;\n this._maxExecutions =\n options.maxExecutionsPerSecond ?? SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_SECOND;\n this._maxExecutionsPerFlush =\n options.maxExecutionsPerFlush ?? SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_EFFECT;\n this._trackModifications = options.trackModifications ?? false;\n\n this._cleanup = null;\n this._dependencies = EMPTY_DEPS as Dependency[];\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n this._unsubscribes = EMPTY_UNSUBS as (() => void)[];\n this._nextDeps = null;\n this._nextVersions = null;\n this._nextUnsubs = null;\n this._history = IS_DEV ? [] : null;\n this._executionCount = 0;\n\n debug.attachDebugInfo(this, 'effect', this.id);\n }\n\n /** Manually triggers effect execution */\n public run = (): void => {\n if (this.isDisposed) {\n throw new EffectError(ERROR_MESSAGES.EFFECT_MUST_BE_FUNCTION);\n }\n if (this._dependencyVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(this._dependencyVersions);\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n }\n this.execute();\n };\n\n /** Disposes effect and cleans up all resources */\n public dispose = (): void => {\n if (this.isDisposed) return;\n\n this._setDisposed();\n this._safeCleanup();\n\n if (this._unsubscribes !== EMPTY_UNSUBS) {\n for (let i = 0; i < this._unsubscribes.length; i++) {\n const unsub = this._unsubscribes[i];\n if (unsub) unsub();\n }\n unsubArrayPool.release(this._unsubscribes);\n this._unsubscribes = EMPTY_UNSUBS as (() => void)[];\n }\n\n if (this._dependencies !== EMPTY_DEPS) {\n depArrayPool.release(this._dependencies);\n this._dependencies = EMPTY_DEPS as Dependency[];\n }\n\n if (this._dependencyVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(this._dependencyVersions);\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n }\n };\n\n /** Adds dependency to tracking list (called by tracking context) */\n public addDependency = (dep: unknown): void => {\n if (this.isExecuting && this._nextDeps && this._nextUnsubs && this._nextVersions) {\n const d = dep as Dependency;\n const epoch = this._currentEpoch;\n\n if (d._lastSeenEpoch === epoch) return;\n d._lastSeenEpoch = epoch;\n\n this._nextDeps.push(d);\n this._nextVersions.push(d.version);\n\n if (d._tempUnsub) {\n this._nextUnsubs.push(d._tempUnsub);\n d._tempUnsub = undefined;\n } else {\n this._subscribeTo(d);\n }\n }\n };\n\n /** Executes effect with dependency tracking */\n public execute = (): void => {\n if (this.isDisposed || this.isExecuting) return;\n if (!this._shouldExecute()) return;\n\n this._checkInfiniteLoop();\n this._setExecuting(true);\n this._safeCleanup();\n\n const prevDeps = this._dependencies;\n const prevVersions = this._dependencyVersions;\n const prevUnsubs = this._unsubscribes;\n const nextDeps = depArrayPool.acquire();\n const nextVersions = versionArrayPool.acquire();\n const nextUnsubs = unsubArrayPool.acquire();\n const epoch = nextEpoch();\n\n if (prevDeps !== EMPTY_DEPS && prevUnsubs !== EMPTY_UNSUBS) {\n for (let i = 0; i < prevDeps.length; i++) {\n const dep = prevDeps[i];\n if (dep) dep._tempUnsub = prevUnsubs[i];\n }\n }\n\n this._nextDeps = nextDeps;\n this._nextVersions = nextVersions;\n this._nextUnsubs = nextUnsubs;\n this._currentEpoch = epoch;\n\n let committed = false;\n\n try {\n const result = trackingContext.run(this, this._fn);\n\n this._dependencies = nextDeps;\n this._dependencyVersions = nextVersions;\n this._unsubscribes = nextUnsubs;\n committed = true;\n\n this._checkLoopWarnings();\n\n if (isPromise(result)) {\n result\n .then((asyncCleanup) => {\n if (!this.isDisposed && typeof asyncCleanup === 'function') {\n this._cleanup = asyncCleanup;\n }\n })\n .catch((error) => {\n console.error(wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_EXECUTION_FAILED));\n });\n } else {\n this._cleanup = typeof result === 'function' ? result : null;\n }\n } catch (error) {\n committed = true;\n console.error(wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_EXECUTION_FAILED));\n this._cleanup = null;\n } finally {\n this._setExecuting(false);\n this._nextDeps = null;\n this._nextVersions = null;\n this._nextUnsubs = null;\n\n if (committed) {\n if (prevDeps !== EMPTY_DEPS) {\n for (let i = 0; i < prevDeps.length; i++) {\n const dep = prevDeps[i];\n if (dep?._tempUnsub) {\n dep._tempUnsub();\n dep._tempUnsub = undefined;\n }\n }\n depArrayPool.release(prevDeps);\n }\n if (prevUnsubs !== EMPTY_UNSUBS) {\n unsubArrayPool.release(prevUnsubs);\n }\n if (prevVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(prevVersions);\n }\n } else {\n depArrayPool.release(nextDeps);\n versionArrayPool.release(nextVersions);\n for (let i = 0; i < nextUnsubs.length; i++) {\n nextUnsubs[i]?.();\n }\n unsubArrayPool.release(nextUnsubs);\n\n if (prevDeps !== EMPTY_DEPS) {\n for (let i = 0; i < prevDeps.length; i++) {\n const dep = prevDeps[i];\n if (dep) dep._tempUnsub = undefined;\n }\n }\n }\n }\n };\n\n private _subscribeTo(dep: Dependency): void {\n try {\n const unsubscribe = dep.subscribe(() => {\n if (this._trackModifications && this.isExecuting) {\n dep._modifiedAtEpoch = this._currentEpoch;\n }\n\n if (this._sync) {\n this.execute();\n } else {\n scheduler.schedule(this.execute);\n }\n });\n if (this._nextUnsubs) {\n this._nextUnsubs.push(unsubscribe);\n }\n } catch (error) {\n console.error(wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_EXECUTION_FAILED));\n if (this._nextUnsubs) this._nextUnsubs.push(() => {});\n }\n }\n\n get isDisposed(): boolean {\n return (this.flags & EFFECT_STATE_FLAGS.DISPOSED) !== 0;\n }\n\n get executionCount(): number {\n return this._executionCount;\n }\n\n get isExecuting(): boolean {\n return (this.flags & EFFECT_STATE_FLAGS.EXECUTING) !== 0;\n }\n\n private _setDisposed(): void {\n this.flags |= EFFECT_STATE_FLAGS.DISPOSED;\n }\n\n private _setExecuting(value: boolean): void {\n const mask = EFFECT_STATE_FLAGS.EXECUTING;\n this.flags = (this.flags & ~mask) | (-Number(value) & mask);\n }\n\n private _safeCleanup(): void {\n if (this._cleanup && typeof this._cleanup === 'function') {\n try {\n this._cleanup();\n } catch (error) {\n console.error(wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_CLEANUP_FAILED));\n }\n this._cleanup = null;\n }\n }\n\n private _checkInfiniteLoop(): void {\n if (this._lastFlushEpoch !== flushEpoch) {\n this._lastFlushEpoch = flushEpoch;\n this._executionsInEpoch = 0;\n }\n\n this._executionsInEpoch++;\n\n if (this._executionsInEpoch > this._maxExecutionsPerFlush) {\n this._throwInfiniteLoopError('per-effect');\n }\n\n if (incrementFlushExecutionCount() > SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_FLUSH) {\n this._throwInfiniteLoopError('global');\n }\n\n this._executionCount++;\n\n if (this._history) {\n const now = Date.now();\n this._history.push(now);\n\n if (this._history.length > SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_SECOND + 10) {\n this._history.shift();\n }\n\n this._checkTimestampLoop(now);\n }\n }\n\n private _checkTimestampLoop(now: number): void {\n const history = this._history;\n if (!history || this._maxExecutions <= 0) return;\n\n const oneSecondAgo = now - 1000;\n let count = 0;\n\n for (let i = history.length - 1; i >= 0; i--) {\n if (history[i]! < oneSecondAgo) break;\n count++;\n }\n\n if (count > this._maxExecutions) {\n const error = new EffectError(\n `Effect executed ${count} times within 1 second. Infinite loop suspected`\n );\n this.dispose();\n console.error(error);\n if (IS_DEV) {\n throw error;\n }\n }\n }\n\n private _throwInfiniteLoopError(type: 'per-effect' | 'global'): never {\n const error = new EffectError(\n `Infinite loop detected (${type}): ` +\n `effect executed ${this._executionsInEpoch} times in current flush. ` +\n `Total executions in flush: ${flushExecutionCount}`\n );\n this.dispose();\n console.error(error);\n throw error;\n }\n\n private _shouldExecute(): boolean {\n if (this._dependencies === EMPTY_DEPS) return true;\n if (this._dependencyVersions === EMPTY_VERSIONS) return true;\n\n for (let i = 0; i < this._dependencies.length; i++) {\n const dep = this._dependencies[i];\n if (!dep) continue;\n\n if ('value' in dep) {\n try {\n untracked(() => (dep as { value: unknown }).value);\n } catch {\n return true;\n }\n }\n\n if (dep.version !== this._dependencyVersions[i]) {\n return true;\n }\n }\n\n return false;\n }\n\n private _checkLoopWarnings(): void {\n if (this._trackModifications && debug.enabled) {\n const dependencies = this._dependencies;\n for (let i = 0; i < dependencies.length; i++) {\n const dep = dependencies[i];\n if (dep && dep._modifiedAtEpoch === this._currentEpoch) {\n debug.warn(\n true,\n `Effect is reading a dependency (${\n debug.getDebugName(dep) || 'unknown'\n }) that it just modified. Infinite loop may occur`\n );\n }\n }\n }\n }\n}\n\n/**\n * Creates a reactive effect that re-executes when dependencies change.\n * @param fn - Effect function (may return cleanup function or Promise)\n * @param options - { sync?: boolean, maxExecutionsPerSecond?: number, trackModifications?: boolean }\n * @throws {EffectError} If fn is not a function\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 type { ComputedAtom, EffectObject, ReadonlyAtom } from '../types';\nimport { debug } from './debug';\n\nexport function isAtom(obj: unknown): obj is ReadonlyAtom {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n 'value' in obj &&\n 'subscribe' in obj &&\n typeof (obj as Record<string, unknown>).subscribe === 'function'\n );\n}\n\nexport function isComputed(obj: unknown): obj is ComputedAtom {\n if (debug.enabled) {\n const debugType = debug.getDebugType(obj);\n if (debugType) {\n return debugType === 'computed';\n }\n }\n return (\n isAtom(obj) &&\n 'invalidate' in obj &&\n typeof (obj as Record<string, unknown>).invalidate === 'function'\n );\n}\n\nexport function isEffect(obj: unknown): obj is EffectObject {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n 'dispose' in obj &&\n 'run' in obj &&\n typeof (obj as Record<string, unknown>).dispose === 'function' &&\n typeof (obj as Record<string, unknown>).run === 'function'\n );\n}\n"],"names":["AsyncState","EFFECT_STATE_FLAGS","COMPUTED_STATE_FLAGS","POOL_CONFIG","SCHEDULER_CONFIG","DEBUG_CONFIG","SMI_MAX","IS_DEV","AtomError","message","cause","recoverable","ComputedError","EffectError","SchedulerError","wrapError","error","ErrorClass","context","errorMessage","isPromise","value","ERROR_MESSAGES","count","DEBUG_NAME","DEBUG_ID","DEBUG_TYPE","NO_DEFAULT_VALUE","hasDependencies","obj","globalCheckEpoch","checkCircularInternal","dep","current","epoch","d","deps","i","debug","condition","_unusedVisited","type","id","target","nextId","generateId","ReactiveNode","ReactiveDependency","listener","newValue","oldValue","sub","err","collectorEpoch","nextEpoch","flushEpoch","flushExecutionCount","isFlushing","startFlush","endFlush","incrementFlushExecutionCount","Scheduler","callback","jobs","flushStarted","job","iterations","max","scheduler","batch","trackingContext","fn","prev","untracked","SubscriberManager","subscriber","isUnsubscribed","idx","lastIndex","onError","AtomImpl","initialValue","sync","currentVersion","fnWithDep","tracker","_newValue","_currentVersion","atom","options","EMPTY_DEPS","EMPTY_UNSUBS","EMPTY_VERSIONS","ArrayPool","arr","emptyConst","acquired","released","rejected","totalRejected","depArrayPool","unsubArrayPool","versionArrayPool","syncDependencies","nextDeps","prevDeps","prevUnsubs","nextUnsubs","ComputedAtomImpl","_dep","debugObj","result","unsub","mask","states","prevVersions","nextVersions","depCount","collect","originalAdd","committed","promise","promiseId","resolvedValue","callbackError","computed","EffectImpl","asyncCleanup","unsubscribe","now","history","oneSecondAgo","dependencies","effect","effectInstance","isAtom","isComputed","debugType","isEffect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/constants.ts","../src/errors/errors.ts","../src/errors/messages.ts","../src/utils/debug.ts","../src/core/base/reactive-node.ts","../src/core/base/reactive-dependency.ts","../src/internal/epoch.ts","../src/internal/scheduler/scheduler.ts","../src/internal/scheduler/batch.ts","../src/tracking/context.ts","../src/tracking/tracking.types.ts","../src/tracking/untracked.ts","../src/utils/subscriber-manager.ts","../src/core/atom/atom.ts","../src/internal/pool.ts","../src/core/utils/dep-tracking.ts","../src/core/computed/index.ts","../src/core/effect/effect.ts","../src/utils/type-guards.ts"],"sourcesContent":["/**\n * Time-related constants (in milliseconds)\n */\nexport const TIME_CONSTANTS = {\n /** One second in milliseconds */\n ONE_SECOND_MS: 1000,\n} as const;\n\n/**\n * Async computation states for computed atoms\n */\nexport const AsyncState = {\n IDLE: 'idle' as const,\n PENDING: 'pending' as const,\n RESOLVED: 'resolved' as const,\n REJECTED: 'rejected' as const,\n} as const;\n\n/**\n * Bit flags for effect state management\n * Using bit flags for efficient state checks (O(1) operations)\n */\nexport const EFFECT_STATE_FLAGS = {\n DISPOSED: 1 << 0, // 0001 - Effect has been disposed\n EXECUTING: 1 << 1, // 0010 - Effect is currently executing\n} as const;\n\n/**\n * Bit flags for computed atom state management\n * Enables fast state transitions and checks without multiple boolean fields\n */\nexport const COMPUTED_STATE_FLAGS = {\n DIRTY: 1 << 0, // 0001 - Needs recomputation\n IDLE: 1 << 1, // 0010 - Initial state, not computed yet\n PENDING: 1 << 2, // 0100 - Async computation in progress\n RESOLVED: 1 << 3, // 1000 - Successfully computed\n REJECTED: 1 << 4, // 10000 - Computation failed\n RECOMPUTING: 1 << 5, // 100000 - Currently recomputing\n HAS_ERROR: 1 << 6, // 1000000 - Has error state\n} as const;\n\n/**\n * Object pool configuration\n * Controls memory management and GC pressure reduction\n */\nexport const POOL_CONFIG = {\n /** Maximum number of pooled objects to prevent memory bloat */\n MAX_SIZE: 1000,\n /** Number of objects to pre-allocate for performance-critical paths */\n WARMUP_SIZE: 100,\n} as const;\n\n/**\n * Scheduler configuration\n * Controls batching behavior and performance limits\n */\nexport const SCHEDULER_CONFIG = {\n /** Maximum effect executions per second to detect infinite loops (Legacy/Fallback) */\n MAX_EXECUTIONS_PER_SECOND: 100,\n /** Threshold for cleaning up old execution timestamps */\n CLEANUP_THRESHOLD: 100,\n\n /**\n * Maximum executions per effect within a single flush cycle\n * Increased from 10 to 50 based on evaluation report\n */\n MAX_EXECUTIONS_PER_EFFECT: 50,\n\n /**\n * Maximum total executions across all effects in a single flush cycle\n * Increased from 1000 to 5000 based on evaluation report\n */\n MAX_EXECUTIONS_PER_FLUSH: 5000,\n\n /** Maximum iterations for synchronous flush loop to prevent infinite loops */\n MAX_FLUSH_ITERATIONS: 1000,\n\n /** Minimum allowed value for max flush iterations */\n MIN_FLUSH_ITERATIONS: 10,\n} as const;\n\n/**\n * Debug configuration defaults\n */\nexport const DEBUG_CONFIG = {\n /** Maximum dependencies before warning about large dependency graphs */\n MAX_DEPENDENCIES: 1000,\n /** Enable infinite loop detection warnings */\n WARN_INFINITE_LOOP: true,\n} as const;\n\n/**\n * Maximum Small Integer (Smi) value in V8 (31-bit signed integer)\n * Used for IDs and Versions to prevent HeapNumber allocation\n */\nexport const SMI_MAX = 0x3fffffff;\n\n/**\n * Environment detection\n */\nexport const IS_DEV =\n typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production';\n","/**\n * Base error class for all atom-effect errors\n *\n * Provides enhanced error information including:\n * - Original cause tracking for error chains\n * - Recoverability flag for error handling strategies\n * - Timestamp for debugging and logging\n *\n * @example\n * ```ts\n * throw new AtomError('Invalid state', originalError, false);\n * ```\n */\nexport class AtomError extends Error {\n /** Original error that caused this error, if any */\n cause: Error | null;\n /** Whether this error can be recovered from */\n recoverable: boolean;\n /** When this error occurred */\n timestamp: Date;\n\n /**\n * Creates a new AtomError\n * @param message - Error message describing what went wrong\n * @param cause - Original error that caused this error\n * @param recoverable - Whether the operation can be retried\n */\n constructor(message: string, cause: Error | null = null, recoverable: boolean = true) {\n super(message);\n this.name = 'AtomError';\n this.cause = cause;\n this.recoverable = recoverable;\n this.timestamp = new Date();\n }\n}\n\n/**\n * Error thrown during computed value computation\n *\n * Computed errors are considered recoverable by default since they typically\n * result from transient data issues rather than programming errors.\n */\nexport class ComputedError extends AtomError {\n /**\n * Creates a new ComputedError\n * @param message - Error message\n * @param cause - Original error\n */\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, true);\n this.name = 'ComputedError';\n }\n}\n\n/**\n * Error thrown during effect execution\n *\n * Effect errors are considered non-recoverable by default since effects\n * typically represent critical side effects that shouldn't fail silently.\n */\nexport class EffectError extends AtomError {\n /**\n * Creates a new EffectError\n * @param message - Error message\n * @param cause - Original error\n */\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, false);\n this.name = 'EffectError';\n }\n}\n\n/**\n * Error thrown by the scheduler system\n *\n * Scheduler errors indicate fundamental issues with the batching/scheduling\n * mechanism and are considered non-recoverable.\n */\nexport class SchedulerError extends AtomError {\n /**\n * Creates a new SchedulerError\n * @param message - Error message\n * @param cause - Original error\n */\n constructor(message: string, cause: Error | null = null) {\n super(message, cause, false);\n this.name = 'SchedulerError';\n }\n}\n\n/**\n * Wraps an unknown error in the appropriate AtomError subclass\n *\n * Provides consistent error handling by:\n * - Preserving original error information in the cause field\n * - Adding contextual information about where the error occurred\n * - Returning existing AtomErrors unchanged\n * - Handling various error types (TypeError, ReferenceError, etc.)\n *\n * @param error - Unknown error to wrap\n * @param ErrorClass - AtomError subclass to use for wrapping\n * @param context - Context string describing where the error occurred\n * @returns Wrapped error with contextual information\n *\n * @example\n * ```ts\n * try {\n * computeFn();\n * } catch (err) {\n * throw wrapError(err, ComputedError, 'computation phase');\n * }\n * ```\n */\nexport function wrapError(\n error: unknown,\n ErrorClass: typeof AtomError,\n context: string\n): AtomError {\n if (error instanceof TypeError) {\n return new ErrorClass(`Type error (${context}): ${error.message}`, error);\n }\n if (error instanceof ReferenceError) {\n return new ErrorClass(`Reference error (${context}): ${error.message}`, error);\n }\n if (error instanceof AtomError) {\n return error;\n }\n\n // Handle other error types\n const errorMessage = error instanceof Error ? error.message : String(error);\n const cause = error instanceof Error ? error : null;\n return new ErrorClass(`Unexpected error (${context}): ${errorMessage}`, cause);\n}\n\n/**\n * Type guard to check if a value is a Promise\n *\n * Uses duck-typing to detect Promise-like objects by checking for\n * the presence of a `then` method.\n *\n * @template T - The type the Promise resolves to\n * @param value - Value to check\n * @returns True if value has a `then` method (is Promise-like)\n *\n * @example\n * ```ts\n * const result = computeFn();\n * if (isPromise(result)) {\n * await result;\n * }\n * ```\n */\nexport function isPromise<T>(value: unknown): value is Promise<T> {\n return value != null && typeof (value as { then?: unknown }).then === 'function';\n}\n","/**\n * Centralized error message constants for the atom-effect library.\n *\n * @description\n * Provides consistent, maintainable error messages across the library.\n * All messages are in English for international accessibility.\n *\n * @remarks\n * - Computed errors: Related to computed atom creation and execution\n * - Atom errors: Related to atom subscription and notification\n * - Effect errors: Related to effect lifecycle and cleanup\n * - Debug warnings: Non-critical warnings for debugging\n *\n * @example\n * ```ts\n * import { ERROR_MESSAGES } from './messages';\n *\n * if (typeof fn !== 'function') {\n * throw new Error(ERROR_MESSAGES.COMPUTED_MUST_BE_FUNCTION);\n * }\n * ```\n */\nexport const ERROR_MESSAGES = {\n // ─────────────────────────────────────────────────────────────────\n // Computed errors\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Error thrown when computed() receives a non-function argument.\n */\n COMPUTED_MUST_BE_FUNCTION: 'Computed function must be a function',\n\n /**\n * Error thrown when subscribe() receives an invalid listener.\n */\n COMPUTED_SUBSCRIBER_MUST_BE_FUNCTION:\n 'Subscriber listener must be a function or Subscriber object',\n\n /**\n * Error thrown when accessing a pending async computed without a default value.\n */\n COMPUTED_ASYNC_PENDING_NO_DEFAULT: 'Async computation is pending. No default value provided',\n\n /**\n * Error thrown when a synchronous computed computation fails.\n */\n COMPUTED_COMPUTATION_FAILED: 'Computed computation failed',\n\n /**\n * Error thrown when an asynchronous computed computation fails.\n */\n COMPUTED_ASYNC_COMPUTATION_FAILED: 'Async computed computation failed',\n\n /**\n * Error thrown when subscribing to a dependency fails.\n */\n COMPUTED_DEPENDENCY_SUBSCRIPTION_FAILED: 'Failed to subscribe to dependency',\n\n // ─────────────────────────────────────────────────────────────────\n // Atom errors\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Error thrown when atom.subscribe() receives an invalid listener.\n */\n ATOM_SUBSCRIBER_MUST_BE_FUNCTION: 'Subscription listener must be a function or Subscriber object',\n\n /**\n * Error thrown when the atom subscriber notification process fails.\n */\n ATOM_SUBSCRIBER_EXECUTION_FAILED: 'Error occurred while executing atom subscribers',\n\n /**\n * Error logged when an individual subscriber throws during notification.\n * @remarks This error is caught and logged to prevent cascading failures.\n */\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: 'Error during individual atom subscriber execution',\n\n // ─────────────────────────────────────────────────────────────────\n // Effect errors\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Error thrown when effect() receives a non-function argument.\n */\n EFFECT_MUST_BE_FUNCTION: 'Effect function must be a function',\n\n /**\n * Error thrown when an effect's execution fails.\n */\n EFFECT_EXECUTION_FAILED: 'Effect execution failed',\n\n /**\n * Error thrown when an effect's cleanup function fails.\n */\n EFFECT_CLEANUP_FAILED: 'Effect cleanup function execution failed',\n\n // ─────────────────────────────────────────────────────────────────\n // Debug warnings\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Warning message for large dependency graphs.\n *\n * @param count - The number of dependencies detected\n * @returns Formatted warning message with dependency count\n *\n * @example\n * ```ts\n * console.warn(ERROR_MESSAGES.LARGE_DEPENDENCY_GRAPH(150));\n * // Output: \"Large dependency graph detected: 150 dependencies\"\n * ```\n */\n LARGE_DEPENDENCY_GRAPH: (count: number): string =>\n `Large dependency graph detected: ${count} dependencies`,\n\n /**\n * Warning logged when attempting to unsubscribe a non-existent listener.\n */\n UNSUBSCRIBE_NON_EXISTENT: 'Attempted to unsubscribe a non-existent listener',\n\n /**\n * Error logged when the onError callback itself throws an error.\n * @remarks This prevents cascading failures from masking the original error.\n */\n CALLBACK_ERROR_IN_ERROR_HANDLER: 'Error occurred during onError callback execution',\n} as const;\n","import { DEBUG_CONFIG } from '@/constants';\nimport { ComputedError } from '@/errors/errors';\nimport type { DebugConfig, Dependency } from '@/types';\n\n/** Symbol for debug display name on reactive objects */\nexport const DEBUG_NAME: unique symbol = Symbol('debugName');\n\n/** Symbol for unique identifier on reactive objects */\nexport const DEBUG_ID: unique symbol = Symbol('id');\n\n/** Symbol for type discriminator ('atom' | 'computed' | 'effect') */\nexport const DEBUG_TYPE: unique symbol = Symbol('type');\n\n/** Sentinel to distinguish \"no default\" from explicit `undefined` */\nexport const NO_DEFAULT_VALUE: unique symbol = Symbol('noDefaultValue');\n\n/** Type guard for objects with dependencies array */\nfunction hasDependencies(obj: Dependency): obj is Dependency & { dependencies: Dependency[] } {\n return 'dependencies' in obj && Array.isArray((obj as { dependencies: unknown }).dependencies);\n}\n\nlet globalCheckEpoch = 0;\n\n/** Internal recursive checker for circular dependency detection */\nfunction checkCircularInternal(dep: Dependency, current: object, epoch: number): void {\n if (dep._visitedEpoch === epoch) {\n return;\n }\n dep._visitedEpoch = epoch;\n\n if (dep === current) {\n throw new ComputedError('Indirect circular dependency detected');\n }\n\n if (hasDependencies(dep)) {\n const deps = dep.dependencies;\n for (let i = 0; i < deps.length; i++) {\n const child = deps[i];\n if (child) checkCircularInternal(child, current, epoch);\n }\n }\n}\n\n/**\n * Debug utilities for development-time dependency tracking and circular detection.\n * Most features only active when `NODE_ENV === 'development'`.\n */\nexport const debug: DebugConfig = {\n enabled:\n typeof process !== 'undefined' && (process as NodeJS.Process).env?.NODE_ENV === 'development',\n\n maxDependencies: DEBUG_CONFIG.MAX_DEPENDENCIES,\n\n warnInfiniteLoop: DEBUG_CONFIG.WARN_INFINITE_LOOP,\n\n warn(condition: boolean, message: string): void {\n if (this.enabled && condition) {\n console.warn(`[Atom Effect] ${message}`);\n }\n },\n\n /**\n * Checks for circular dependencies.\n * Direct check runs always; indirect check only in dev mode.\n * @throws {ComputedError} When circular dependency detected\n */\n checkCircular(dep: Dependency, current: object): void {\n if (dep === current) {\n throw new ComputedError('Direct circular dependency detected');\n }\n\n if (!this.enabled) {\n return;\n }\n\n globalCheckEpoch++;\n checkCircularInternal(dep, current, globalCheckEpoch);\n },\n\n attachDebugInfo(obj: object, type: string, id: number): void {\n if (!this.enabled) {\n return;\n }\n\n const target = obj as Record<symbol, unknown>;\n target[DEBUG_NAME] = `${type}_${id}`;\n target[DEBUG_ID] = id;\n target[DEBUG_TYPE] = type;\n },\n\n getDebugName(obj: object | null | undefined): string | undefined {\n if (obj != null && DEBUG_NAME in obj) {\n return (obj as Record<symbol, unknown>)[DEBUG_NAME] as string | undefined;\n }\n return undefined;\n },\n\n getDebugType(obj: object | null | undefined): string | undefined {\n if (obj != null && DEBUG_TYPE in obj) {\n return (obj as Record<symbol, unknown>)[DEBUG_TYPE] as string | undefined;\n }\n return undefined;\n },\n};\n\nlet nextId = 1;\n\n/** Generates a unique numeric ID for reactive objects */\nexport const generateId = (): number => nextId++;\n","import { SMI_MAX } from '@/constants';\nimport { generateId } from '@/utils/debug';\n\n/**\n * Base class for all reactive nodes (Atoms, Computed, Effects).\n *\n * Optimized for V8 hidden classes:\n * - Initializes Smi (Small Integer) fields first.\n * - Provides common identity and flag management.\n */\nexport class ReactiveNode {\n // === Smi Fields (Fixed Order for V8 Hidden Class) ===\n /** Unique numerical identifier (Smi) */\n readonly id: number;\n\n /** Internal flags (Smi) for state management (Disposed, Dirty, etc.) */\n flags: number;\n\n constructor() {\n this.id = generateId() & SMI_MAX;\n this.flags = 0;\n }\n}\n","import { AtomError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport type { Subscriber } from '@/types';\nimport type { SubscriberManager } from '@/utils/subscriber-manager';\nimport { ReactiveNode } from './reactive-node';\n\n/**\n * Abstract base class for reactive nodes that can be dependencies (Atom, Computed).\n *\n * Extends ReactiveNode with versioning and subscriber management.\n *\n * Performance Note:\n * Abstract accessors are used for subscriber managers to allow subclasses\n * to define the actual storage fields *after* their own Smi fields.\n * This ensures all Smi fields (from Base, Dependency, and Subclass) are\n * packed together at the start of the object for V8 optimization.\n */\nexport abstract class ReactiveDependency<T> extends ReactiveNode {\n // === Smi Fields (Continued from ReactiveNode) ===\n /** Version counter for change detection (Smi) */\n version: number;\n\n /** Last seen epoch for dependency collection (Smi) */\n _lastSeenEpoch: number;\n\n constructor() {\n super();\n this.version = 0;\n this._lastSeenEpoch = -1;\n }\n\n // === Abstract Accessors for Object Fields ===\n // Implemented by subclasses to control field layout\n protected abstract get _functionSubscribers(): SubscriberManager<\n (newValue?: T, oldValue?: T) => void\n >;\n protected abstract get _objectSubscribers(): SubscriberManager<Subscriber>;\n\n /**\n * Subscribes a listener function or Subscriber object to value changes.\n *\n * @param listener - Function or Subscriber object to call when the value changes\n * @returns An unsubscribe function\n * @throws {AtomError} If listener is not a function or Subscriber\n */\n subscribe(listener: ((newValue?: T, oldValue?: T) => void) | Subscriber): () => void {\n // Support Subscriber object for zero-allocation pattern\n if (typeof listener === 'object' && listener !== null && 'execute' in listener) {\n return this._objectSubscribers.add(listener);\n }\n\n if (typeof listener !== 'function') {\n throw new AtomError(ERROR_MESSAGES.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);\n }\n return this._functionSubscribers.add(listener);\n }\n\n /**\n * Gets the total number of active subscribers.\n */\n subscriberCount(): number {\n return this._functionSubscribers.size + this._objectSubscribers.size;\n }\n\n /**\n * Notifies all subscribers of a change.\n *\n * @param newValue - The new value\n * @param oldValue - The old value\n */\n protected _notifySubscribers(newValue: T | undefined, oldValue: T | undefined): void {\n this._functionSubscribers.forEachSafe(\n (sub) => sub(newValue, oldValue),\n (err) =>\n console.error(new AtomError(ERROR_MESSAGES.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED, err as Error))\n );\n\n this._objectSubscribers.forEachSafe(\n (sub) => sub.execute(),\n (err) =>\n console.error(new AtomError(ERROR_MESSAGES.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED, err as Error))\n );\n }\n}\n","import { IS_DEV, SMI_MAX } from '@/constants';\n\nlet collectorEpoch = 0;\n\nexport function nextEpoch(): number {\n collectorEpoch = ((collectorEpoch + 1) | 0) & SMI_MAX;\n return collectorEpoch;\n}\n\nexport function currentEpoch(): number {\n return collectorEpoch;\n}\n\n// === Infinite Loop Detection State ===\n\nexport let flushEpoch = 0;\nexport let flushExecutionCount = 0;\nlet isFlushing = false;\n\nexport function startFlush(): boolean {\n if (isFlushing) {\n if (IS_DEV) {\n console.warn(\n 'Warning: startFlush() called during flush - ignored to prevent infinite loop detection bypass'\n );\n }\n return false;\n }\n\n isFlushing = true;\n flushEpoch = (flushEpoch + 1) & SMI_MAX;\n flushExecutionCount = 0;\n return true;\n}\n\nexport function endFlush(): void {\n isFlushing = false;\n}\n\nexport function incrementFlushExecutionCount(): number {\n if (!isFlushing) return 0;\n return ++flushExecutionCount;\n}\n\nexport function resetFlushState(): void {\n flushEpoch = 0;\n flushExecutionCount = 0;\n isFlushing = false;\n}\n","import { SCHEDULER_CONFIG } from '@/constants';\nimport { SchedulerError } from '../../errors/errors';\nimport { endFlush, startFlush } from '../epoch';\n\nexport enum SchedulerPhase {\n IDLE = 0,\n BATCHING = 1,\n FLUSHING = 2,\n}\n\nexport type SchedulerJob = (() => void) & { _nextEpoch?: number };\n\n/**\n * Scheduler for reactive updates with batching support.\n * Uses epoch-based O(1) deduplication and double buffering.\n */\nclass Scheduler {\n private queueA: SchedulerJob[] = [];\n private queueB: SchedulerJob[] = [];\n private queue: SchedulerJob[] = this.queueA;\n private queueSize = 0;\n private _epoch = 0;\n private isProcessing: boolean = false;\n public isBatching: boolean = false;\n private batchDepth: number = 0;\n private batchQueue: SchedulerJob[] = [];\n private batchQueueSize = 0;\n private isFlushingSync: boolean = false;\n private maxFlushIterations: number = SCHEDULER_CONFIG.MAX_FLUSH_ITERATIONS;\n\n get phase(): SchedulerPhase {\n if (this.isProcessing || this.isFlushingSync) {\n return SchedulerPhase.FLUSHING;\n }\n if (this.isBatching) {\n return SchedulerPhase.BATCHING;\n }\n return SchedulerPhase.IDLE;\n }\n\n schedule(callback: SchedulerJob): void {\n if (typeof callback !== 'function') {\n throw new SchedulerError('Scheduler callback must be a function');\n }\n\n // O(1) dedup via epoch\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 } else {\n this.queue[this.queueSize++] = callback;\n if (!this.isProcessing) {\n this.flush();\n }\n }\n }\n\n private flush(): void {\n if (this.isProcessing || this.queueSize === 0) return;\n\n this.isProcessing = true;\n\n const jobs = this.queue;\n const count = this.queueSize;\n\n this.queue = this.queue === this.queueA ? this.queueB : this.queueA;\n this.queueSize = 0;\n this._epoch++;\n\n queueMicrotask(() => {\n const flushStarted = startFlush();\n\n for (let i = 0; i < count; i++) {\n try {\n jobs[i]?.();\n } catch (error) {\n console.error(\n new SchedulerError('Error occurred during scheduler execution', error as Error)\n );\n }\n }\n\n jobs.length = 0;\n this.isProcessing = false;\n\n if (flushStarted) endFlush();\n\n if (this.queueSize > 0 && !this.isBatching) {\n this.flush();\n }\n });\n }\n\n private flushSync(): void {\n this.isFlushingSync = true;\n const flushStarted = startFlush();\n\n try {\n this._epoch++;\n\n if (this.batchQueueSize > 0) {\n for (let i = 0; i < this.batchQueueSize; i++) {\n const job = this.batchQueue[i]!;\n if (job._nextEpoch !== this._epoch) {\n job._nextEpoch = this._epoch;\n this.queue[this.queueSize++] = job;\n }\n }\n this.batchQueueSize = 0;\n }\n\n let iterations = 0;\n\n while (this.queueSize > 0) {\n if (++iterations > this.maxFlushIterations) {\n console.error(\n new SchedulerError(\n `Maximum flush iterations (${this.maxFlushIterations}) exceeded. Possible infinite loop.`\n )\n );\n this.queueSize = 0;\n this.queue.length = 0;\n this.batchQueueSize = 0;\n break;\n }\n\n const jobs = this.queue;\n const count = this.queueSize;\n\n this.queue = this.queue === this.queueA ? this.queueB : this.queueA;\n this.queueSize = 0;\n this._epoch++;\n\n for (let i = 0; i < count; i++) {\n try {\n jobs[i]?.();\n } catch (error) {\n console.error(\n new SchedulerError('Error occurred during batch execution', error as Error)\n );\n }\n }\n\n jobs.length = 0;\n\n if (this.batchQueueSize > 0) {\n for (let i = 0; i < this.batchQueueSize; i++) {\n this.queue[this.queueSize++] = this.batchQueue[i]!;\n }\n this.batchQueueSize = 0;\n }\n }\n } finally {\n this.isFlushingSync = false;\n if (flushStarted) endFlush();\n }\n }\n\n startBatch(): void {\n this.batchDepth++;\n this.isBatching = true;\n }\n\n endBatch(): void {\n this.batchDepth = Math.max(0, this.batchDepth - 1);\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 }\n this.maxFlushIterations = max;\n }\n}\n\nexport const scheduler = new Scheduler();\n","import { AtomError } from '@/errors/errors';\nimport { scheduler } from './scheduler';\n\n/**\n * Executes multiple reactive updates in a single batch.\n *\n * Batching groups multiple state changes together, deferring notifications\n * until all updates are complete. This prevents intermediate states from\n * triggering unnecessary recomputations and improves performance.\n *\n * @template T - The return type of the callback function\n * @param callback - The function containing batched updates\n * @returns The result of the callback function\n * @throws {AtomError} If the callback is not a function\n * @throws {AtomError} If an error occurs during batch execution\n *\n * @example\n * ```typescript\n * const firstName = atom('John');\n * const lastName = atom('Doe');\n *\n * // Without batching: triggers 2 separate updates\n * firstName.value = 'Jane';\n * lastName.value = 'Smith';\n *\n * // With batching: triggers 1 combined update\n * batch(() => {\n * firstName.value = 'Jane';\n * lastName.value = 'Smith';\n * });\n * ```\n */\nexport function batch<T>(callback: () => T): T {\n if (typeof callback !== 'function') {\n throw new AtomError('Batch callback must be a function');\n }\n\n scheduler.startBatch();\n\n try {\n return callback();\n } catch (error) {\n throw new AtomError('Error occurred during batch execution', error as Error);\n } finally {\n scheduler.endBatch();\n }\n}\n","import type { Listener } from './tracking.types';\n\n/** Interface for the tracking context managing dependency collection */\nexport interface TrackingContext {\n current: Listener | null;\n\n /** Executes fn within tracking context with given listener */\n run<T>(listener: Listener, fn: () => T): T;\n\n getCurrent(): Listener | null;\n}\n\n/**\n * Global tracking context for dependency collection.\n * Atoms register as dependencies when accessed within a tracked context.\n */\nexport const trackingContext: TrackingContext = {\n current: null,\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 getCurrent(): Listener | null {\n return this.current;\n },\n};\n","import type { Dependency } from '@/types';\n\n/** Subscriber capable of tracking dependencies. */\nexport interface DependencySubscriber {\n /** Registers a dependency. */\n addDependency: (dep: Dependency) => void;\n}\n\n/** Subscriber capable of being executed. */\nexport interface ExecutableSubscriber {\n /** Triggers the execution logic. */\n execute: () => void;\n}\n\n/** Combined interface for tracking and execution. */\nexport interface DependencyTracker {\n addDependency?: (dep: Dependency) => void;\n execute?: () => void;\n}\n\n/** A function that may optionally include dependency tracking. */\nexport type TrackableFunction = (() => void) & Partial<DependencySubscriber>;\n\n/** A listener that is either a structured tracker or a plain callback. */\nexport type Listener = DependencyTracker | TrackableFunction;\n\n/** Internal guard to verify if a value is a non-null object. */\nfunction isNonNullObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\n/** Checks if the value implements the DependencySubscriber interface. */\nexport function hasDependencyMethod(value: unknown): value is DependencySubscriber {\n return (\n (typeof value === 'object' || typeof value === 'function') &&\n value !== null &&\n typeof (value as DependencySubscriber).addDependency === 'function'\n );\n}\n\n/** Checks if the value is a function with an addDependency method. */\nexport function isTrackableFunction(\n value: unknown\n): value is TrackableFunction & DependencySubscriber {\n return (\n typeof value === 'function' && typeof (value as TrackableFunction).addDependency === 'function'\n );\n}\n\n/** Checks if the value is a plain function without tracking capabilities. */\nexport function isPlainListener(value: unknown): value is () => void {\n return (\n typeof value === 'function' && typeof (value as TrackableFunction).addDependency !== 'function'\n );\n}\n\n/** Checks if the value implements the ExecutableSubscriber interface. */\nexport function hasExecuteMethod(value: unknown): value is ExecutableSubscriber {\n return isNonNullObject(value) && typeof value.execute === 'function';\n}\n","import { AtomError } from '@/errors/errors';\nimport { trackingContext } from './context';\n\n/**\n * Executes a function without tracking any reactive dependencies.\n *\n * This utility allows reading atom values without establishing\n * a dependency relationship, useful for accessing values that\n * shouldn't trigger recomputation when they change.\n *\n * @template T - The return type of the function\n * @param fn - The function to execute without tracking\n * @returns The result of the executed function\n * @throws {AtomError} If the callback is not a function\n * @throws {AtomError} If an error occurs during execution\n *\n * @example\n * ```typescript\n * const count = atom(0);\n * const doubled = computed(() => {\n * // This read will NOT be tracked as a dependency\n * const untrackedValue = untracked(() => count.value);\n * return untrackedValue * 2;\n * });\n * ```\n */\nexport function untracked<T>(fn: () => T): T {\n if (typeof fn !== 'function') {\n throw new AtomError('Untracked callback must be a function');\n }\n\n const prev = trackingContext.current;\n trackingContext.current = null;\n\n try {\n return fn();\n } catch (error) {\n throw new AtomError('Error occurred during untracked execution', error as Error);\n } finally {\n trackingContext.current = prev;\n }\n}\n","/**\n * Manages subscribers with optimized array-based operations.\n * Uses linear search (cache-friendly for small arrays) + swap-and-pop removal.\n */\nexport class SubscriberManager<T> {\n private subscribers: T[] | null = null;\n\n /** Adds subscriber and returns unsubscribe function (idempotent) */\n add(subscriber: T): () => void {\n if (!this.subscribers) {\n this.subscribers = [];\n }\n\n if (this.subscribers.indexOf(subscriber) !== -1) {\n return () => {};\n }\n\n this.subscribers.push(subscriber);\n\n let isUnsubscribed = false;\n return () => {\n if (isUnsubscribed) return;\n isUnsubscribed = true;\n this.remove(subscriber);\n };\n }\n\n /** Removes subscriber using swap-and-pop */\n remove(subscriber: T): boolean {\n if (!this.subscribers) {\n return false;\n }\n\n const idx = this.subscribers.indexOf(subscriber);\n if (idx === -1) {\n return false;\n }\n\n const lastIndex = this.subscribers.length - 1;\n if (idx !== lastIndex) {\n this.subscribers[idx] = this.subscribers[lastIndex]!;\n }\n this.subscribers.pop();\n\n return true;\n }\n\n has(subscriber: T): boolean {\n if (!this.subscribers) return false;\n return this.subscribers.indexOf(subscriber) !== -1;\n }\n\n forEach(fn: (subscriber: T, index: number) => void): void {\n if (!this.subscribers) return;\n\n for (let i = 0; i < this.subscribers.length; i++) {\n fn(this.subscribers[i]!, i);\n }\n }\n\n /** Iterates with error handling to prevent one failure from breaking the chain */\n forEachSafe(fn: (subscriber: T, index: number) => void, onError?: (error: Error) => void): void {\n if (!this.subscribers) return;\n\n for (let i = 0; i < this.subscribers.length; i++) {\n try {\n fn(this.subscribers[i]!, i);\n } catch (error) {\n if (onError) {\n onError(error as Error);\n } else {\n console.error('[SubscriberManager] Error in subscriber callback:', error);\n }\n }\n }\n }\n\n get size(): number {\n return this.subscribers?.length ?? 0;\n }\n\n get hasSubscribers(): boolean {\n return this.subscribers !== null && this.subscribers.length > 0;\n }\n\n clear(): void {\n this.subscribers = null;\n }\n\n toArray(): T[] {\n return this.subscribers ? [...this.subscribers] : [];\n }\n}\n","import { SMI_MAX } from '@/constants';\nimport { ReactiveDependency } from '@/core/base/reactive-dependency';\nimport { scheduler } from '@/internal/scheduler';\nimport { trackingContext } from '@/tracking';\nimport { hasDependencyMethod, hasExecuteMethod, isPlainListener } from '@/tracking/tracking.types';\nimport type { AtomOptions, Subscriber, WritableAtom } from '@/types';\nimport { debug } from '@/utils/debug';\nimport { SubscriberManager } from '@/utils/subscriber-manager';\n\n/** Internal WritableAtom implementation with optimized subscriber management */\nclass AtomImpl<T> extends ReactiveDependency<T> implements WritableAtom<T> {\n private _value: T;\n private readonly _functionSubscribersStore: SubscriberManager<\n (newValue?: T, oldValue?: T) => void\n >;\n private readonly _objectSubscribersStore: SubscriberManager<Subscriber>;\n private readonly _sync: boolean;\n private readonly _notifyTask: () => void;\n private _pendingOldValue: T | undefined;\n private _isNotificationScheduled: boolean = false;\n\n constructor(initialValue: T, sync: boolean) {\n super();\n this._value = initialValue;\n this._functionSubscribersStore = new SubscriberManager();\n this._objectSubscribersStore = new SubscriberManager();\n this._sync = sync;\n this._notifyTask = this._flushNotifications.bind(this);\n debug.attachDebugInfo(this, 'atom', this.id);\n }\n\n protected get _functionSubscribers(): SubscriberManager<(newValue?: T, oldValue?: T) => void> {\n return this._functionSubscribersStore;\n }\n\n protected get _objectSubscribers(): SubscriberManager<Subscriber> {\n return this._objectSubscribersStore;\n }\n\n /** Gets value and registers as dependency in current tracking context */\n get value(): T {\n const current = trackingContext.getCurrent();\n if (current) this._track(current);\n return this._value;\n }\n\n /** Sets value and notifies subscribers if changed (uses Object.is) */\n set value(newValue: T) {\n if (Object.is(this._value, newValue)) return;\n\n const oldValue = this._value;\n this.version = (this.version + 1) & SMI_MAX;\n this._value = newValue;\n\n // Early exit: no subscribers to notify\n if (\n !this._functionSubscribersStore.hasSubscribers &&\n !this._objectSubscribersStore.hasSubscribers\n )\n return;\n\n this._scheduleNotification(oldValue);\n }\n\n private _track(current: unknown): void {\n // Priority 1: TrackableListener pattern (addDependency method)\n if (hasDependencyMethod(current)) {\n current.addDependency(this);\n return;\n }\n // Priority 2: Plain function callback\n if (isPlainListener(current)) {\n this._functionSubscribersStore.add(current as (newValue?: T, oldValue?: T) => void);\n return;\n }\n // Priority 3: Subscriber pattern (execute method)\n if (hasExecuteMethod(current)) {\n this._objectSubscribersStore.add(current);\n }\n }\n\n private _scheduleNotification(oldValue: T): void {\n if (!this._isNotificationScheduled) {\n this._pendingOldValue = oldValue;\n this._isNotificationScheduled = true;\n }\n\n // Hot path first: sync mode without batching flushes immediately\n if (this._sync && !scheduler.isBatching) {\n this._flushNotifications();\n } else {\n scheduler.schedule(this._notifyTask);\n }\n }\n\n private _flushNotifications(): void {\n if (!this._isNotificationScheduled) return;\n\n const oldValue = this._pendingOldValue as T;\n const newValue = this._value;\n\n this._pendingOldValue = undefined;\n this._isNotificationScheduled = false;\n\n this._notifySubscribers(newValue, oldValue);\n }\n\n /** Gets value without registering as dependency */\n peek(): T {\n return this._value;\n }\n\n dispose(): void {\n this._functionSubscribersStore.clear();\n this._objectSubscribersStore.clear();\n this._value = undefined as T;\n }\n}\n\n/**\n * Creates a reactive atom holding mutable state.\n * @param initialValue - Initial value\n * @param options - { sync?: boolean } for immediate notifications\n */\nexport function atom<T>(initialValue: T, options: AtomOptions = {}): WritableAtom<T> {\n return new AtomImpl(initialValue, options.sync ?? false);\n}\n","import { IS_DEV } from '@/constants';\nimport type { Dependency, Subscriber } from '@/types';\nimport type { PoolStats } from '@/types/internal';\n\n// Shared Constants\nexport const EMPTY_DEPS: readonly Dependency[] = Object.freeze([]);\nexport const EMPTY_SUBS: readonly Subscriber[] = Object.freeze([]);\nexport const EMPTY_UNSUBS: readonly (() => void)[] = Object.freeze([]);\n\nexport const EMPTY_VERSIONS: readonly number[] = Object.freeze([]);\n\n/**\n * Generic Array Pool (Type-safe pooling for different array types)\n */\nclass ArrayPool<T> {\n private pool: T[][] = [];\n private readonly maxPoolSize = 50;\n private readonly maxReusableCapacity = 256;\n\n private stats = IS_DEV\n ? {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 },\n }\n : null;\n\n acquire(): T[] {\n if (IS_DEV && this.stats) this.stats.acquired++;\n return this.pool.pop() ?? [];\n }\n\n release(arr: T[], emptyConst?: readonly T[]): void {\n // 1. Reference check first\n if (emptyConst && arr === emptyConst) return;\n\n // 2. Frozen check\n if (Object.isFrozen(arr)) {\n if (IS_DEV && this.stats) this.stats.rejected.frozen++;\n return;\n }\n\n // 3. Size check\n if (arr.length > this.maxReusableCapacity) {\n if (IS_DEV && this.stats) this.stats.rejected.tooLarge++;\n return;\n }\n\n // 4. Pool capacity check\n if (this.pool.length >= this.maxPoolSize) {\n if (IS_DEV && this.stats) this.stats.rejected.poolFull++;\n return;\n }\n\n // 5. Normal release\n arr.length = 0;\n this.pool.push(arr);\n if (IS_DEV && this.stats) this.stats.released++;\n }\n\n getStats(): PoolStats | null {\n if (!IS_DEV || !this.stats) return null;\n const { acquired, released, rejected } = this.stats;\n const totalRejected = rejected.frozen + rejected.tooLarge + rejected.poolFull;\n return {\n acquired,\n released,\n rejected,\n leaked: acquired - released - totalRejected,\n poolSize: this.pool.length,\n };\n }\n\n reset(): void {\n this.pool.length = 0;\n if (IS_DEV && this.stats) {\n this.stats.acquired = 0;\n this.stats.released = 0;\n this.stats.rejected = { frozen: 0, tooLarge: 0, poolFull: 0 };\n }\n }\n}\n\n// Per-type Pool Instances (V8 Shape Optimization)\nexport const depArrayPool = new ArrayPool<Dependency>();\nexport const subArrayPool = new ArrayPool<Subscriber>();\nexport const unsubArrayPool = new ArrayPool<() => void>();\nexport const versionArrayPool = new ArrayPool<number>();\n","import { EMPTY_DEPS, EMPTY_UNSUBS, unsubArrayPool } from '@/internal/pool';\nimport type { Dependency, Subscriber } from '@/types';\nimport { debug } from '@/utils/debug';\n\n/**\n * Synchronizes subscriptions based on dependency changes using O(N) strategy.\n * Maps unsubs 1:1 with dependencies array.\n *\n * Shared logic for Computed and Effect to manage their dependencies.\n *\n * @param nextDeps - The new list of dependencies collected\n * @param prevDeps - The previous list of dependencies\n * @param prevUnsubs - The previous list of unsubscribe functions\n * @param tracker - The object tracking these dependencies (Computed or Effect)\n * @returns The new list of unsubscribe functions\n */\nexport function syncDependencies(\n nextDeps: Dependency[],\n prevDeps: Dependency[],\n prevUnsubs: (() => void)[],\n tracker: Subscriber\n): (() => void)[] {\n // 1. Map existing subscriptions to dependencies for O(1) lookup during sync\n if (prevDeps !== EMPTY_DEPS && prevUnsubs !== EMPTY_UNSUBS) {\n for (let i = 0; i < prevDeps.length; i++) {\n const dep = prevDeps[i];\n if (dep) dep._tempUnsub = prevUnsubs[i];\n }\n }\n\n // 2. Build new unsubscribe array\n const nextUnsubs = unsubArrayPool.acquire();\n\n // Ensure nextUnsubs has same length as nextDeps\n nextUnsubs.length = nextDeps.length;\n\n for (let i = 0; i < nextDeps.length; i++) {\n const dep = nextDeps[i];\n if (!dep) continue;\n\n if (dep._tempUnsub) {\n // Reuse existing subscription\n nextUnsubs[i] = dep._tempUnsub;\n dep._tempUnsub = undefined; // Consumed\n } else {\n debug.checkCircular(dep, tracker);\n nextUnsubs[i] = dep.subscribe(tracker);\n }\n }\n\n // 3. Cleanup unused subscriptions (from removals)\n if (prevDeps !== EMPTY_DEPS) {\n for (let i = 0; i < prevDeps.length; i++) {\n const dep = prevDeps[i];\n if (dep?._tempUnsub) {\n // Still has _tempUnsub => was not reused in nextDeps => Removed\n dep._tempUnsub();\n dep._tempUnsub = undefined;\n }\n }\n }\n\n // 4. Release old unsub array\n if (prevUnsubs !== EMPTY_UNSUBS) {\n unsubArrayPool.release(prevUnsubs);\n }\n\n return nextUnsubs;\n}\n","import { AsyncState, COMPUTED_STATE_FLAGS, SMI_MAX } from '@/constants';\nimport { ReactiveDependency } from '@/core/base/reactive-dependency';\nimport { syncDependencies } from '@/core/utils/dep-tracking';\nimport type { AtomError } from '@/errors/errors';\nimport { ComputedError, isPromise, wrapError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport { nextEpoch } from '@/internal/epoch';\nimport {\n depArrayPool,\n EMPTY_DEPS,\n EMPTY_UNSUBS,\n EMPTY_VERSIONS,\n unsubArrayPool,\n versionArrayPool,\n} from '@/internal/pool';\nimport { trackingContext } from '@/tracking';\nimport { hasDependencyMethod, hasExecuteMethod, isPlainListener } from '@/tracking/tracking.types';\n\nimport type {\n AsyncStateType,\n ComputedAtom,\n ComputedOptions,\n Dependency,\n Subscriber,\n} from '@/types';\nimport { debug, NO_DEFAULT_VALUE } from '@/utils/debug';\nimport { SubscriberManager } from '@/utils/subscriber-manager';\n\ntype TrackableListener = (() => void) & {\n addDependency: (dep: Dependency) => void;\n};\n\n/**\n * Computed atom with lazy evaluation, caching, and async support.\n * Uses bit flags for state and epoch-based dependency deduplication.\n */\nclass ComputedAtomImpl<T> extends ReactiveDependency<T> implements ComputedAtom<T>, Subscriber {\n private _value: T;\n private _error: AtomError | null;\n private _promiseId: number;\n private readonly _equal: (a: T, b: T) => boolean;\n\n private readonly _fn: () => T | Promise<T>;\n private readonly _defaultValue: T;\n private readonly _hasDefaultValue: boolean;\n private readonly _onError: ((error: Error) => void) | null;\n private readonly _functionSubscribersStore: SubscriberManager<\n (newValue?: T, oldValue?: T) => void\n >;\n private readonly _objectSubscribersStore: SubscriberManager<Subscriber>;\n private _dependencies: Dependency[];\n private _dependencyVersions: number[];\n private _unsubscribes: (() => void)[];\n\n private readonly _notifyJob: () => void;\n private readonly _trackable: TrackableListener;\n private readonly MAX_PROMISE_ID: number;\n\n constructor(fn: () => T | Promise<T>, options: ComputedOptions<T> = {}) {\n if (typeof fn !== 'function') {\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_MUST_BE_FUNCTION);\n }\n\n super();\n\n this._value = undefined as T;\n this.flags = COMPUTED_STATE_FLAGS.DIRTY | COMPUTED_STATE_FLAGS.IDLE;\n\n this._error = null;\n this._promiseId = 0;\n this._equal = options.equal ?? Object.is;\n\n this._fn = fn;\n this._defaultValue = 'defaultValue' in options ? options.defaultValue : (NO_DEFAULT_VALUE as T);\n this._hasDefaultValue = this._defaultValue !== (NO_DEFAULT_VALUE as T);\n this._onError = options.onError ?? null;\n this.MAX_PROMISE_ID = Number.MAX_SAFE_INTEGER - 1;\n\n this._functionSubscribersStore = new SubscriberManager<(newValue?: T, oldValue?: T) => void>();\n this._objectSubscribersStore = new SubscriberManager<Subscriber>();\n\n this._dependencies = EMPTY_DEPS as Dependency[];\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n this._unsubscribes = EMPTY_UNSUBS as (() => void)[];\n\n this._notifyJob = () => {\n this._functionSubscribersStore.forEachSafe(\n (subscriber) => subscriber(),\n (err) => console.error(err)\n );\n\n this._objectSubscribersStore.forEachSafe(\n (subscriber) => subscriber.execute(),\n (err) => console.error(err)\n );\n };\n\n this._trackable = Object.assign(() => this._markDirty(), {\n addDependency: (_dep: Dependency) => {},\n });\n\n debug.attachDebugInfo(this as unknown as ComputedAtom<T>, 'computed', this.id);\n\n if (debug.enabled) {\n const debugObj = this as unknown as ComputedAtom<T> & {\n subscriberCount: () => number;\n isDirty: () => boolean;\n dependencies: Dependency[];\n stateFlags: string;\n };\n debugObj.subscriberCount = () =>\n this._functionSubscribersStore.size + this._objectSubscribersStore.size;\n debugObj.isDirty = () => this._isDirty();\n debugObj.dependencies = this._dependencies;\n debugObj.stateFlags = this._getFlagsAsString();\n }\n\n if (options.lazy === false) {\n try {\n this._recompute();\n } catch {\n // Ignore initial computation failure\n }\n }\n }\n\n protected get _functionSubscribers(): SubscriberManager<(newValue?: T, oldValue?: T) => void> {\n return this._functionSubscribersStore;\n }\n\n protected get _objectSubscribers(): SubscriberManager<Subscriber> {\n return this._objectSubscribersStore;\n }\n\n get value(): T {\n const result = this._computeValue();\n this._registerTracking();\n return result;\n }\n\n peek(): T {\n return this._value;\n }\n\n get state(): AsyncStateType {\n return this._getAsyncState();\n }\n\n get hasError(): boolean {\n return this._isRejected();\n }\n\n get lastError(): Error | null {\n return this._error;\n }\n\n get isPending(): boolean {\n return this._isPending();\n }\n\n get isResolved(): boolean {\n return this._isResolved();\n }\n\n invalidate(): void {\n this._markDirty();\n if (this._dependencyVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(this._dependencyVersions);\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n }\n }\n\n dispose(): void {\n if (this._unsubscribes !== EMPTY_UNSUBS) {\n for (let i = 0; i < this._unsubscribes.length; i++) {\n const unsub = this._unsubscribes[i];\n if (unsub) unsub();\n }\n unsubArrayPool.release(this._unsubscribes);\n this._unsubscribes = EMPTY_UNSUBS as (() => void)[];\n }\n\n if (this._dependencies !== EMPTY_DEPS) {\n depArrayPool.release(this._dependencies);\n this._dependencies = EMPTY_DEPS as Dependency[];\n }\n\n if (this._dependencyVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(this._dependencyVersions);\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n }\n\n this._functionSubscribersStore.clear();\n this._objectSubscribersStore.clear();\n this.flags = COMPUTED_STATE_FLAGS.DIRTY | COMPUTED_STATE_FLAGS.IDLE;\n this._error = null;\n this._value = undefined as T;\n this._promiseId = (this._promiseId + 1) % this.MAX_PROMISE_ID;\n }\n\n // State flag operations\n private _isDirty(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.DIRTY) !== 0;\n }\n\n private _setDirty(): void {\n this.flags |= COMPUTED_STATE_FLAGS.DIRTY;\n }\n\n private _clearDirty(): void {\n this.flags &= ~COMPUTED_STATE_FLAGS.DIRTY;\n }\n\n private _isIdle(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.IDLE) !== 0;\n }\n\n private _setIdle(): void {\n this.flags |= COMPUTED_STATE_FLAGS.IDLE;\n this.flags &= ~(\n COMPUTED_STATE_FLAGS.PENDING |\n COMPUTED_STATE_FLAGS.RESOLVED |\n COMPUTED_STATE_FLAGS.REJECTED\n );\n }\n\n private _isPending(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.PENDING) !== 0;\n }\n\n private _setPending(): void {\n this.flags |= COMPUTED_STATE_FLAGS.PENDING;\n this.flags &= ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.RESOLVED |\n COMPUTED_STATE_FLAGS.REJECTED\n );\n }\n\n private _isResolved(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.RESOLVED) !== 0;\n }\n\n private _setResolved(): void {\n this.flags |= COMPUTED_STATE_FLAGS.RESOLVED;\n this.flags &= ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.PENDING |\n COMPUTED_STATE_FLAGS.REJECTED |\n COMPUTED_STATE_FLAGS.HAS_ERROR\n );\n }\n\n private _isRejected(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.REJECTED) !== 0;\n }\n\n private _setRejected(): void {\n this.flags |= COMPUTED_STATE_FLAGS.REJECTED | COMPUTED_STATE_FLAGS.HAS_ERROR;\n this.flags &= ~(\n COMPUTED_STATE_FLAGS.IDLE |\n COMPUTED_STATE_FLAGS.PENDING |\n COMPUTED_STATE_FLAGS.RESOLVED\n );\n }\n\n private _isRecomputing(): boolean {\n return (this.flags & COMPUTED_STATE_FLAGS.RECOMPUTING) !== 0;\n }\n\n private _setRecomputing(value: boolean): void {\n const mask = COMPUTED_STATE_FLAGS.RECOMPUTING;\n this.flags = (this.flags & ~mask) | (-Number(value) & mask);\n }\n\n private _getAsyncState(): AsyncStateType {\n // Hot path first: RESOLVED is the most common state after initial computation\n if (this._isResolved()) return AsyncState.RESOLVED;\n if (this._isPending()) return AsyncState.PENDING;\n if (this._isRejected()) return AsyncState.REJECTED;\n return AsyncState.IDLE;\n }\n\n private _getFlagsAsString(): string {\n const states: string[] = [];\n if (this._isDirty()) states.push('DIRTY');\n if (this._isIdle()) states.push('IDLE');\n if (this._isPending()) states.push('PENDING');\n if (this._isResolved()) states.push('RESOLVED');\n if (this._isRejected()) states.push('REJECTED');\n if (this._isRecomputing()) states.push('RECOMPUTING');\n return states.join(' | ');\n }\n\n private _computeValue(): T {\n if (this._isRecomputing()) return this._value;\n\n if (this._isDirty() || this._isIdle()) {\n this._recompute();\n }\n\n if (this._isPending()) return this._handlePending();\n if (this._isRejected()) return this._handleRejected();\n\n return this._value;\n }\n\n private _recompute(): void {\n if (this._isRecomputing()) return;\n\n this._setRecomputing(true);\n\n const prevDeps = this._dependencies;\n const prevVersions = this._dependencyVersions;\n const nextDeps = depArrayPool.acquire();\n const nextVersions = versionArrayPool.acquire();\n const epoch = nextEpoch();\n\n let depCount = 0;\n\n const collect = (dep: Dependency) => {\n if (dep._lastSeenEpoch === epoch) return;\n dep._lastSeenEpoch = epoch;\n\n if (depCount < nextDeps.length) {\n nextDeps[depCount] = dep;\n nextVersions[depCount] = dep.version;\n } else {\n nextDeps.push(dep);\n nextVersions.push(dep.version);\n }\n depCount++;\n };\n\n const originalAdd = this._trackable.addDependency;\n this._trackable.addDependency = collect;\n\n let committed = false;\n\n try {\n const result = trackingContext.run(this._trackable, this._fn);\n\n nextDeps.length = depCount;\n nextVersions.length = depCount;\n\n if (isPromise(result)) {\n this._unsubscribes = syncDependencies(nextDeps, prevDeps, this._unsubscribes, this);\n this._dependencies = nextDeps;\n this._dependencyVersions = nextVersions;\n committed = true;\n\n this._handleAsyncComputation(result);\n this._setRecomputing(false);\n return;\n }\n\n this._unsubscribes = syncDependencies(nextDeps, prevDeps, this._unsubscribes, this);\n this._dependencies = nextDeps;\n this._dependencyVersions = nextVersions;\n committed = true;\n\n this._handleSyncResult(result);\n } catch (err) {\n nextDeps.length = depCount;\n nextVersions.length = depCount;\n this._unsubscribes = syncDependencies(nextDeps, prevDeps, this._unsubscribes, this);\n this._dependencies = nextDeps;\n this._dependencyVersions = nextVersions;\n committed = true;\n\n this._handleComputationError(err);\n } finally {\n this._trackable.addDependency = originalAdd;\n\n if (committed) {\n if (prevDeps !== EMPTY_DEPS) {\n depArrayPool.release(prevDeps as Dependency[]);\n }\n if (prevVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(prevVersions);\n }\n } else {\n depArrayPool.release(nextDeps);\n versionArrayPool.release(nextVersions);\n }\n }\n }\n\n private _handleSyncResult(result: T): void {\n const valueChanged = !this._isResolved() || !this._equal(this._value, result);\n if (valueChanged) {\n this.version = (this.version + 1) & SMI_MAX;\n }\n\n this._value = result;\n this._clearDirty();\n this._setResolved();\n this._error = null;\n this._setRecomputing(false);\n }\n\n private _handleAsyncComputation(promise: Promise<T>): void {\n this._setPending();\n this._clearDirty();\n\n this._promiseId = this._promiseId >= this.MAX_PROMISE_ID ? 1 : this._promiseId + 1;\n const promiseId = this._promiseId;\n\n promise\n .then((resolvedValue) => {\n if (promiseId !== this._promiseId) return;\n this._handleAsyncResolution(resolvedValue);\n })\n .catch((err) => {\n if (promiseId !== this._promiseId) return;\n this._handleAsyncRejection(err);\n });\n }\n\n private _handleAsyncResolution(resolvedValue: T): void {\n const valueChanged = !this._isResolved() || !this._equal(this._value, resolvedValue);\n if (valueChanged) {\n this.version = (this.version + 1) & SMI_MAX;\n }\n\n this._value = resolvedValue;\n this._clearDirty();\n this._setResolved();\n this._error = null;\n this._setRecomputing(false);\n }\n\n private _handleAsyncRejection(err: unknown): void {\n const error = wrapError(err, ComputedError, ERROR_MESSAGES.COMPUTED_ASYNC_COMPUTATION_FAILED);\n\n this._error = error;\n this._setRejected();\n this._clearDirty();\n this._setRecomputing(false);\n\n if (this._onError) {\n try {\n this._onError(error);\n } catch (callbackError) {\n console.error(ERROR_MESSAGES.CALLBACK_ERROR_IN_ERROR_HANDLER, callbackError);\n }\n }\n\n this._notifySubscribers(undefined, undefined);\n }\n\n private _handleComputationError(err: unknown): never {\n const error = wrapError(err, ComputedError, ERROR_MESSAGES.COMPUTED_COMPUTATION_FAILED);\n\n this._error = error;\n this._setRejected();\n this._clearDirty();\n this._setRecomputing(false);\n\n if (this._onError) {\n try {\n this._onError(error);\n } catch (callbackError) {\n console.error(ERROR_MESSAGES.CALLBACK_ERROR_IN_ERROR_HANDLER, callbackError);\n }\n }\n\n throw error;\n }\n\n private _handlePending(): T {\n if (this._hasDefaultValue) {\n return this._defaultValue;\n }\n throw new ComputedError(ERROR_MESSAGES.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n\n private _handleRejected(): T {\n if (this._error?.recoverable && this._hasDefaultValue) {\n return this._defaultValue;\n }\n throw this._error;\n }\n\n /** Subscriber interface - marks dirty on dependency change */\n execute(): void {\n this._markDirty();\n }\n\n private _markDirty(): void {\n if (this._isRecomputing() || this._isDirty()) return;\n\n this._setDirty();\n this._notifyJob();\n }\n\n private _registerTracking(): void {\n const current = trackingContext.getCurrent();\n if (!current) return;\n\n // Priority 1: Has addDependency method (TrackableListener or DependencyTracker)\n if (hasDependencyMethod(current)) {\n current.addDependency(this);\n return;\n }\n\n // Priority 2: Plain function callback\n if (isPlainListener(current)) {\n this._functionSubscribersStore.add(current);\n return;\n }\n\n // Priority 3: Object with execute method (Subscriber pattern)\n if (hasExecuteMethod(current)) {\n this._objectSubscribersStore.add(current);\n }\n }\n}\n\nObject.freeze(ComputedAtomImpl.prototype);\n\n/**\n * Creates a computed value with automatic dependency tracking.\n * Supports sync/async computations with caching and lazy evaluation.\n * @param fn - Computation function (sync or async)\n * @param options - { equal?, defaultValue?, onError?, lazy? }\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) as unknown as ComputedAtom<T>;\n}\n","import { EFFECT_STATE_FLAGS, IS_DEV, SCHEDULER_CONFIG, TIME_CONSTANTS } from '@/constants';\nimport { ReactiveNode } from '@/core/base/reactive-node';\nimport { EffectError, isPromise, wrapError } from '@/errors/errors';\nimport { ERROR_MESSAGES } from '@/errors/messages';\nimport {\n flushEpoch,\n flushExecutionCount,\n incrementFlushExecutionCount,\n nextEpoch,\n} from '@/internal/epoch';\nimport {\n depArrayPool,\n EMPTY_DEPS,\n EMPTY_UNSUBS,\n EMPTY_VERSIONS,\n unsubArrayPool,\n versionArrayPool,\n} from '@/internal/pool';\nimport { scheduler } from '@/internal/scheduler';\nimport { type DependencyTracker, trackingContext, untracked } from '@/tracking';\nimport type { Dependency, EffectFunction, EffectObject, EffectOptions } from '@/types';\nimport { debug } from '@/utils/debug';\n\n/** Internal effect implementation with dependency tracking and infinite loop detection */\nclass EffectImpl extends ReactiveNode implements EffectObject, DependencyTracker {\n private _currentEpoch: number;\n private _lastFlushEpoch: number;\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 private readonly _trackModifications: boolean;\n\n private _cleanup: (() => void) | null;\n private _dependencies: Dependency[];\n private _dependencyVersions: number[];\n private _unsubscribes: (() => void)[];\n private _nextDeps: Dependency[] | null;\n private _nextVersions: number[] | null;\n private _nextUnsubs: (() => void)[] | null;\n private _history: number[] | null;\n private _executionCount: number;\n\n constructor(fn: EffectFunction, options: EffectOptions = {}) {\n super();\n\n this._currentEpoch = -1;\n this._lastFlushEpoch = -1;\n this._executionsInEpoch = 0;\n\n this._fn = fn;\n this._sync = options.sync ?? false;\n this._maxExecutions =\n options.maxExecutionsPerSecond ?? SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_SECOND;\n this._maxExecutionsPerFlush =\n options.maxExecutionsPerFlush ?? SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_EFFECT;\n this._trackModifications = options.trackModifications ?? false;\n\n this._cleanup = null;\n this._dependencies = EMPTY_DEPS as Dependency[];\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n this._unsubscribes = EMPTY_UNSUBS as (() => void)[];\n this._nextDeps = null;\n this._nextVersions = null;\n this._nextUnsubs = null;\n this._history = IS_DEV ? [] : null;\n this._executionCount = 0;\n\n debug.attachDebugInfo(this, 'effect', this.id);\n }\n\n /** Manually triggers effect execution */\n public run = (): void => {\n if (this.isDisposed) {\n throw new EffectError(ERROR_MESSAGES.EFFECT_MUST_BE_FUNCTION);\n }\n if (this._dependencyVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(this._dependencyVersions);\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n }\n this.execute();\n };\n\n /** Disposes effect and cleans up all resources */\n public dispose = (): void => {\n if (this.isDisposed) return;\n\n this._setDisposed();\n this._safeCleanup();\n\n if (this._unsubscribes !== EMPTY_UNSUBS) {\n for (let i = 0; i < this._unsubscribes.length; i++) {\n const unsub = this._unsubscribes[i];\n if (unsub) unsub();\n }\n unsubArrayPool.release(this._unsubscribes);\n this._unsubscribes = EMPTY_UNSUBS as (() => void)[];\n }\n\n if (this._dependencies !== EMPTY_DEPS) {\n depArrayPool.release(this._dependencies);\n this._dependencies = EMPTY_DEPS as Dependency[];\n }\n\n if (this._dependencyVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(this._dependencyVersions);\n this._dependencyVersions = EMPTY_VERSIONS as number[];\n }\n };\n\n /** Adds dependency to tracking list (called by tracking context) */\n public addDependency = (dep: Dependency): void => {\n if (this.isExecuting && this._nextDeps && this._nextUnsubs && this._nextVersions) {\n const epoch = this._currentEpoch;\n\n if (dep._lastSeenEpoch === epoch) return;\n dep._lastSeenEpoch = epoch;\n\n this._nextDeps.push(dep);\n this._nextVersions.push(dep.version);\n\n if (dep._tempUnsub) {\n this._nextUnsubs.push(dep._tempUnsub);\n dep._tempUnsub = undefined;\n } else {\n this._subscribeTo(dep);\n }\n }\n };\n\n /** Executes effect with dependency tracking */\n public execute = (): void => {\n if (this.isDisposed || this.isExecuting) return;\n if (!this._shouldExecute()) return;\n\n this._checkInfiniteLoop();\n this._setExecuting(true);\n this._safeCleanup();\n\n const prevDeps = this._dependencies;\n const prevVersions = this._dependencyVersions;\n const prevUnsubs = this._unsubscribes;\n const nextDeps = depArrayPool.acquire();\n const nextVersions = versionArrayPool.acquire();\n const nextUnsubs = unsubArrayPool.acquire();\n const epoch = nextEpoch();\n\n if (prevDeps !== EMPTY_DEPS && prevUnsubs !== EMPTY_UNSUBS) {\n for (let i = 0; i < prevDeps.length; i++) {\n const dep = prevDeps[i];\n if (dep) dep._tempUnsub = prevUnsubs[i];\n }\n }\n\n this._nextDeps = nextDeps;\n this._nextVersions = nextVersions;\n this._nextUnsubs = nextUnsubs;\n this._currentEpoch = epoch;\n\n let committed = false;\n\n try {\n const result = trackingContext.run(this, this._fn);\n\n this._dependencies = nextDeps;\n this._dependencyVersions = nextVersions;\n this._unsubscribes = nextUnsubs;\n committed = true;\n\n this._checkLoopWarnings();\n\n if (isPromise(result)) {\n result\n .then((asyncCleanup) => {\n if (!this.isDisposed && typeof asyncCleanup === 'function') {\n this._cleanup = asyncCleanup;\n }\n })\n .catch((error) => {\n console.error(wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_EXECUTION_FAILED));\n });\n } else {\n this._cleanup = typeof result === 'function' ? result : null;\n }\n } catch (error) {\n committed = true;\n console.error(wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_EXECUTION_FAILED));\n this._cleanup = null;\n } finally {\n this._setExecuting(false);\n this._nextDeps = null;\n this._nextVersions = null;\n this._nextUnsubs = null;\n\n if (committed) {\n if (prevDeps !== EMPTY_DEPS) {\n for (let i = 0; i < prevDeps.length; i++) {\n const dep = prevDeps[i];\n if (dep?._tempUnsub) {\n dep._tempUnsub();\n dep._tempUnsub = undefined;\n }\n }\n depArrayPool.release(prevDeps);\n }\n if (prevUnsubs !== EMPTY_UNSUBS) {\n unsubArrayPool.release(prevUnsubs);\n }\n if (prevVersions !== EMPTY_VERSIONS) {\n versionArrayPool.release(prevVersions);\n }\n } else {\n depArrayPool.release(nextDeps);\n versionArrayPool.release(nextVersions);\n for (let i = 0; i < nextUnsubs.length; i++) {\n nextUnsubs[i]?.();\n }\n unsubArrayPool.release(nextUnsubs);\n\n if (prevDeps !== EMPTY_DEPS) {\n for (let i = 0; i < prevDeps.length; i++) {\n const dep = prevDeps[i];\n if (dep) dep._tempUnsub = undefined;\n }\n }\n }\n }\n };\n\n private _subscribeTo(dep: Dependency): void {\n try {\n const unsubscribe = dep.subscribe(() => {\n if (this._trackModifications && this.isExecuting) {\n dep._modifiedAtEpoch = this._currentEpoch;\n }\n\n if (this._sync) {\n this.execute();\n } else {\n scheduler.schedule(this.execute);\n }\n });\n if (this._nextUnsubs) {\n this._nextUnsubs.push(unsubscribe);\n }\n } catch (error) {\n console.error(wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_EXECUTION_FAILED));\n if (this._nextUnsubs) this._nextUnsubs.push(() => {});\n }\n }\n\n get isDisposed(): boolean {\n return (this.flags & EFFECT_STATE_FLAGS.DISPOSED) !== 0;\n }\n\n get executionCount(): number {\n return this._executionCount;\n }\n\n get isExecuting(): boolean {\n return (this.flags & EFFECT_STATE_FLAGS.EXECUTING) !== 0;\n }\n\n private _setDisposed(): void {\n this.flags |= EFFECT_STATE_FLAGS.DISPOSED;\n }\n\n private _setExecuting(value: boolean): void {\n const mask = EFFECT_STATE_FLAGS.EXECUTING;\n this.flags = (this.flags & ~mask) | (-Number(value) & mask);\n }\n\n private _safeCleanup(): void {\n if (this._cleanup) {\n try {\n this._cleanup();\n } catch (error) {\n console.error(wrapError(error, EffectError, ERROR_MESSAGES.EFFECT_CLEANUP_FAILED));\n }\n this._cleanup = null;\n }\n }\n\n private _checkInfiniteLoop(): void {\n if (this._lastFlushEpoch !== flushEpoch) {\n this._lastFlushEpoch = flushEpoch;\n this._executionsInEpoch = 0;\n }\n\n this._executionsInEpoch++;\n\n if (this._executionsInEpoch > this._maxExecutionsPerFlush) {\n this._throwInfiniteLoopError('per-effect');\n }\n\n if (incrementFlushExecutionCount() > SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_FLUSH) {\n this._throwInfiniteLoopError('global');\n }\n\n this._executionCount++;\n\n if (this._history) {\n const now = Date.now();\n this._history.push(now);\n\n if (this._history.length > SCHEDULER_CONFIG.MAX_EXECUTIONS_PER_SECOND + 10) {\n this._history.shift();\n }\n\n this._checkTimestampLoop(now);\n }\n }\n\n private _checkTimestampLoop(now: number): void {\n const history = this._history;\n if (!history || this._maxExecutions <= 0) return;\n\n const oneSecondAgo = now - TIME_CONSTANTS.ONE_SECOND_MS;\n let count = 0;\n\n for (let i = history.length - 1; i >= 0; i--) {\n if (history[i]! < oneSecondAgo) break;\n count++;\n }\n\n if (count > this._maxExecutions) {\n const error = new EffectError(\n `Effect executed ${count} times within 1 second. Infinite loop suspected`\n );\n this.dispose();\n console.error(error);\n if (IS_DEV) {\n throw error;\n }\n }\n }\n\n private _throwInfiniteLoopError(type: 'per-effect' | 'global'): never {\n const error = new EffectError(\n `Infinite loop detected (${type}): ` +\n `effect executed ${this._executionsInEpoch} times in current flush. ` +\n `Total executions in flush: ${flushExecutionCount}`\n );\n this.dispose();\n console.error(error);\n throw error;\n }\n\n private _shouldExecute(): boolean {\n // Early exit: no deps or no version cache means first run or invalidated\n if (this._dependencies === EMPTY_DEPS || this._dependencyVersions === EMPTY_VERSIONS)\n return true;\n\n for (let i = 0; i < this._dependencies.length; i++) {\n const dep = this._dependencies[i];\n if (!dep) continue;\n\n if ('value' in dep) {\n try {\n untracked(() => (dep as { value: unknown }).value);\n } catch {\n return true;\n }\n }\n\n if (dep.version !== this._dependencyVersions[i]) {\n return true;\n }\n }\n\n return false;\n }\n\n private _checkLoopWarnings(): void {\n if (this._trackModifications && debug.enabled) {\n const dependencies = this._dependencies;\n for (let i = 0; i < dependencies.length; i++) {\n const dep = dependencies[i];\n if (dep && dep._modifiedAtEpoch === this._currentEpoch) {\n debug.warn(\n true,\n `Effect is reading a dependency (${\n debug.getDebugName(dep) || 'unknown'\n }) that it just modified. Infinite loop may occur`\n );\n }\n }\n }\n }\n}\n\n/**\n * Creates a reactive effect that re-executes when dependencies change.\n * @param fn - Effect function (may return cleanup function or Promise)\n * @param options - { sync?: boolean, maxExecutionsPerSecond?: number, trackModifications?: boolean }\n * @throws {EffectError} If fn is not a function\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 type { ComputedAtom, EffectObject, ReadonlyAtom } from '@/types';\nimport { debug } from './debug';\n\nexport function isAtom(obj: unknown): obj is ReadonlyAtom {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n 'value' in obj &&\n 'subscribe' in obj &&\n typeof (obj as Record<string, unknown>).subscribe === 'function'\n );\n}\n\nexport function isComputed(obj: unknown): obj is ComputedAtom {\n if (debug.enabled && (obj === null || obj === undefined || typeof obj === 'object')) {\n const debugType = debug.getDebugType(obj);\n if (debugType) {\n return debugType === 'computed';\n }\n }\n return (\n isAtom(obj) &&\n 'invalidate' in obj &&\n typeof (obj as Record<string, unknown>).invalidate === 'function'\n );\n}\n\nexport function isEffect(obj: unknown): obj is EffectObject {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n 'dispose' in obj &&\n 'run' in obj &&\n typeof (obj as Record<string, unknown>).dispose === 'function' &&\n typeof (obj as Record<string, unknown>).run === 'function'\n );\n}\n"],"names":["TIME_CONSTANTS","AsyncState","EFFECT_STATE_FLAGS","COMPUTED_STATE_FLAGS","POOL_CONFIG","SCHEDULER_CONFIG","DEBUG_CONFIG","SMI_MAX","IS_DEV","AtomError","message","cause","recoverable","ComputedError","EffectError","SchedulerError","wrapError","error","ErrorClass","context","errorMessage","isPromise","value","ERROR_MESSAGES","count","DEBUG_NAME","DEBUG_ID","DEBUG_TYPE","NO_DEFAULT_VALUE","hasDependencies","obj","globalCheckEpoch","checkCircularInternal","dep","current","epoch","deps","i","child","debug","condition","type","id","target","nextId","generateId","ReactiveNode","ReactiveDependency","listener","newValue","oldValue","sub","err","collectorEpoch","nextEpoch","flushEpoch","flushExecutionCount","isFlushing","startFlush","endFlush","incrementFlushExecutionCount","Scheduler","callback","jobs","flushStarted","job","iterations","max","scheduler","batch","trackingContext","fn","prev","isNonNullObject","hasDependencyMethod","isPlainListener","hasExecuteMethod","untracked","SubscriberManager","subscriber","isUnsubscribed","idx","lastIndex","onError","AtomImpl","initialValue","sync","atom","options","EMPTY_DEPS","EMPTY_UNSUBS","EMPTY_VERSIONS","ArrayPool","arr","emptyConst","acquired","released","rejected","totalRejected","depArrayPool","unsubArrayPool","versionArrayPool","syncDependencies","nextDeps","prevDeps","prevUnsubs","tracker","nextUnsubs","ComputedAtomImpl","_dep","debugObj","result","unsub","mask","states","prevVersions","nextVersions","depCount","collect","originalAdd","committed","promise","promiseId","resolvedValue","callbackError","computed","EffectImpl","asyncCleanup","unsubscribe","now","history","oneSecondAgo","dependencies","effect","effectInstance","isAtom","isComputed","debugType","isEffect"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@but212/atom-effect",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.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",
|
|
@@ -62,13 +62,13 @@
|
|
|
62
62
|
"lint": "biome check .",
|
|
63
63
|
"lint:fix": "biome check --write .",
|
|
64
64
|
"format": "biome format --write .",
|
|
65
|
-
"bench": "vitest bench",
|
|
66
|
-
"bench:micro": "
|
|
67
|
-
"bench:macro": "
|
|
68
|
-
"bench:atom": "
|
|
69
|
-
"bench:computed": "
|
|
70
|
-
"bench:effect": "
|
|
71
|
-
"bench:realistic": "
|
|
72
|
-
"bench:propagation": "
|
|
65
|
+
"bench": "vitest bench --config vitest.bench.config.ts",
|
|
66
|
+
"bench:micro": "pnpm run bench __benchmarks__/micro",
|
|
67
|
+
"bench:macro": "pnpm run bench __benchmarks__/macro",
|
|
68
|
+
"bench:atom": "pnpm run bench __benchmarks__/micro/atom.bench",
|
|
69
|
+
"bench:computed": "pnpm run bench __benchmarks__/micro/computed.bench",
|
|
70
|
+
"bench:effect": "pnpm run bench __benchmarks__/micro/effect.bench",
|
|
71
|
+
"bench:realistic": "pnpm run bench __benchmarks__/realistic",
|
|
72
|
+
"bench:propagation": "pnpm run bench __benchmarks__/micro/propagation.bench"
|
|
73
73
|
}
|
|
74
74
|
}
|