{
  "version": 3,
  "sources": ["../src/index.ts"],
  "sourcesContent": ["export const CycleError = new Error('Cycle detected')\n\nconst _effectStack:(() => any)[] = []\nlet _globalMaxDepth = 100\nconst DEFAULT_MAX_DEPTH = 100\n\n// Batching state\nlet _batchDepth = 0\nlet _batchedEffects:((() => any) & { _execute?:() => void })[] = []\n\nexport type SignOptions = {\n    maxDepth?:number\n}\n\nexport type Sign<T> = {\n    value:T\n    peek:()=>T\n}\n\nexport function sign<T> (value:T, options?:SignOptions):Sign<T> {\n    const maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH\n    const subscriptions = new Set<()=>any>()\n\n    // If this signal has a custom maxDepth, set it globally\n    if (options?.maxDepth !== undefined) {\n        _globalMaxDepth = maxDepth\n    }\n\n    return {\n        get value ():T {\n            const currentEffect = _effectStack[_effectStack.length - 1]\n            if (currentEffect) {\n                subscriptions.add(currentEffect)\n            }\n\n            return value\n        },\n\n        set value (newValue:T) {\n            if (newValue === value) return\n            value = newValue\n\n            // Always notify subscribers immediately\n            // During batching, effects will queue themselves instead of executing\n            subscriptions.forEach(fn => fn())\n        },\n\n        peek () {\n            return value\n        }\n    }\n}\n\nexport function effect (fn:()=>any):()=>void {\n    let isActive = true\n\n    const effectFn = () => {\n        if (!isActive) return\n\n        if (_batchDepth > 0) {\n            // We're in a batch - queue this effect instead of executing immediately\n            if (!_batchedEffects.includes(effectFn)) {\n                _batchedEffects.push(effectFn)\n            }\n            return\n        }\n\n        if (_effectStack.length > _globalMaxDepth) {\n            throw CycleError\n        }\n        _effectStack.push(effectFn)\n        try {\n            fn()\n        } finally {\n            _effectStack.pop()\n        }\n    }\n\n    // Add a way to execute the effect bypassing batch queue\n    effectFn._execute = () => {\n        if (!isActive) return\n\n        if (_effectStack.length > _globalMaxDepth) {\n            throw CycleError\n        }\n        _effectStack.push(effectFn)\n        try {\n            fn()\n        } finally {\n            _effectStack.pop()\n        }\n    }\n\n    effectFn()\n\n    // Unsubscribe function\n    return () => {\n        isActive = false\n    }\n}\n\nexport function computed<T> (fn:()=>T):Sign<T> {\n    const initialValue = fn()\n    const computedSign = sign(initialValue)\n    let isStale = false\n\n    const updateComputed = () => {\n        if (isStale) {\n            const newValue = fn()\n            computedSign.value = newValue\n            isStale = false\n        }\n    }\n\n    // Override the getter to update if stale when accessed\n    const originalDescriptor = Object.getOwnPropertyDescriptor(computedSign, 'value')!\n    Object.defineProperty(computedSign, 'value', {\n        get () {\n            if (isStale) {\n                updateComputed()\n            }\n            return originalDescriptor.get!.call(this)\n        },\n        set: originalDescriptor.set\n    })\n\n    // Create a special computed effect that immediately marks as stale\n    const computedEffect = () => {\n        const newValue = fn()\n        const currentValue = computedSign.peek()\n\n        if (newValue !== currentValue) {\n            isStale = true\n            // Always update the computed signal to notify subscribers\n            // The subscribers (effects) will handle batching themselves\n            updateComputed()\n        }\n    }\n\n    // This effect should NOT be batched - it needs to run immediately to mark the computed as stale\n    const isActive = true\n\n    const dependencyEffect = () => {\n        if (!isActive) return\n\n        // This effect should NEVER be batched - it needs to run immediately\n        // to mark computed signals as stale when their dependencies change\n\n        if (_effectStack.length > _globalMaxDepth) {\n            throw CycleError\n        }\n        _effectStack.push(dependencyEffect)\n        try {\n            fn() // This subscribes to dependencies\n            computedEffect() // This handles the update logic - runs immediately\n        } finally {\n            _effectStack.pop()\n        }\n    }\n\n    dependencyEffect()\n\n    return computedSign\n}\n\nexport function batch<T> (fn:() => T):T {\n    _batchDepth++\n\n    try {\n        const result = fn()\n\n        // If this is the outermost batch, flush all batched effects\n        if (_batchDepth === 1) {\n            const effects = [..._batchedEffects]\n            _batchedEffects = []\n\n            // Execute all batched effects\n            effects.forEach(effectFn => {\n                if (effectFn._execute) {\n                    effectFn._execute()\n                } else {\n                    effectFn()\n                }\n            })\n        }\n\n        return result\n    } finally {\n        _batchDepth--\n    }\n}\n"],
  "mappings": "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",
  "names": []
}
