From b2032c08ca4d32fd12df900ef08d83b79df3fc7e Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 20 Jul 2026 07:20:21 +0000 Subject: [PATCH 1/2] perf: dedupe signal resolution in core signal hooks useSignalReference read the SignalContext twice per render: once directly and again inside useMakeOrRetrieveSignal. Collapse to a single useContext read by inlining the virtual-signal lookup. useSignal now passes the already-resolved signal to useSignalValue and useSetSignal instead of the raw input, so the (virtual) signal is resolved through the context once per render instead of three times. Behavior is unchanged: getOrCreateSignal is idempotent, so the resolved instance is identical to what each child hook produced before. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01JgDrYRTXLbRPYELZvShgk3 --- src/lib/state/react/useSignal.ts | 6 ++++-- src/lib/state/react/useSignalReference.ts | 13 ++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/lib/state/react/useSignal.ts b/src/lib/state/react/useSignal.ts index 2f61e41..54f2b7a 100644 --- a/src/lib/state/react/useSignal.ts +++ b/src/lib/state/react/useSignal.ts @@ -17,8 +17,10 @@ export function useSignal( export function useSignal(signal: Signal | VirtualSignal) { const finalSignal = useSignalReference(signal) - const value = useSignalValue(signal) - const setValue = useSetSignal(signal) + // Reuse the already-resolved signal so the value/setter hooks don't + // re-resolve the (virtual) signal through the context on every render. + const value = useSignalValue(finalSignal) + const setValue = useSetSignal(finalSignal) return [value, setValue, finalSignal] as const } diff --git a/src/lib/state/react/useSignalReference.ts b/src/lib/state/react/useSignalReference.ts index 31de280..9b3951f 100644 --- a/src/lib/state/react/useSignalReference.ts +++ b/src/lib/state/react/useSignalReference.ts @@ -1,8 +1,5 @@ import { type Signal, VirtualSignal } from "../Signal" -import { - useMakeOrRetrieveSignal, - useSignalContext, -} from "./SignalContextProvider" +import { useSignalContext } from "./SignalContextProvider" export function useSignalReference( signal: Signal | VirtualSignal, @@ -15,7 +12,9 @@ export function useSignalReference( ) } - return (useMakeOrRetrieveSignal( - signal instanceof VirtualSignal ? signal : undefined, - ) ?? signal) as Signal + return ( + signal instanceof VirtualSignal + ? signalContext.getOrCreateSignal(signal) + : signal + ) as Signal } From c122c2c3750badd77d64d3bb709eada92a8d2094 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 24 Jul 2026 08:53:18 +0000 Subject: [PATCH 2/2] chore: drop explanatory comment in useSignal Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01JgDrYRTXLbRPYELZvShgk3 --- src/lib/state/react/useSignal.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/lib/state/react/useSignal.ts b/src/lib/state/react/useSignal.ts index 54f2b7a..5f94705 100644 --- a/src/lib/state/react/useSignal.ts +++ b/src/lib/state/react/useSignal.ts @@ -17,8 +17,6 @@ export function useSignal( export function useSignal(signal: Signal | VirtualSignal) { const finalSignal = useSignalReference(signal) - // Reuse the already-resolved signal so the value/setter hooks don't - // re-resolve the (virtual) signal through the context on every render. const value = useSignalValue(finalSignal) const setValue = useSetSignal(finalSignal)