diff --git a/src/lib/state/useSignalValue.ts b/src/lib/state/useSignalValue.ts index 9d7d50a..c43a648 100644 --- a/src/lib/state/useSignalValue.ts +++ b/src/lib/state/useSignalValue.ts @@ -1,6 +1,27 @@ +import { distinctUntilChanged, map } from "rxjs" import { useObserve } from "../binding/useObserve" import { type Signal } from "./signal" -export const useSignalValue = (signal: Signal, key?: string) => { - return useObserve(signal.subject, { defaultValue: signal.getValue(), key }) +export function useSignalValue( + signal: Signal, + selector: (value: S) => L +): L +export function useSignalValue(signal: Signal): S +export function useSignalValue( + signal: Signal, + selector?: (value: S) => L +) { + const selectorOrDefault = selector ?? ((v) => v) + + return useObserve( + () => + signal.subject.pipe( + map((value) => selectorOrDefault(value)), + distinctUntilChanged() + ), + { + defaultValue: selectorOrDefault(signal.getValue()) + }, + [] + ) }