import { useRef, useMemo, useCallback, useEffect, useSyncExternalStore, } from 'react'; import { signal, computed, batch, effect, Signal, type ReadonlySignal, } from '@preact/signals-core'; const EMPTY: unknown[] = []; export {signal, computed, batch, effect, Signal, type ReadonlySignal}; export function useSignal(value: T, dependencies: any[] = EMPTY) { return useMemo(() => signal(value), dependencies); } export function useComputed(compute: () => T, dependencies: any[] = EMPTY) { const $compute = useRef(compute); $compute.current = compute; return useMemo(() => computed(() => $compute.current()), dependencies); } export function useSignalEffect( cb: () => void | (() => void), dependencies: any[] = EMPTY, ) { const callback = useRef(cb); callback.current = cb; useEffect(() => { return effect(() => { callback.current(); }); }, dependencies); } export function useSignalState(signal: Signal) { const value = useSignalValue(signal); const update = useCallback( (update: T | ((current: T) => T)) => { signal.value = typeof update === 'function' ? (update as any)(signal.peek()) : update; }, [signal], ); return [value, update] as const; } export function useSignalValue(signal: Signal) { const [subscribe, getSnapshot] = useMemo< Parameters> >( () => [(subscribe) => signal.subscribe(subscribe), () => signal.peek()], [signal], ); return useSyncExternalStore(subscribe, getSnapshot); }