import { customRef, onBeforeUnmount, ref, Ref, UnwrapRef, watch } from "vue" export function pluckRef(ref: Ref, key: K): Ref { return customRef((track, trigger) => { const stopWatching = watch(ref, (newVal, oldVal) => { if (newVal[key] !== oldVal[key]) { trigger() } }) onBeforeUnmount(() => { stopWatching() }) return { get() { track() return ref.value[key] }, set(value: T[K]) { trigger() ref.value = Object.assign(ref.value, { [key]: value }) }, } }) } export function pluckMultipleFromRef>( sourceRef: Ref, keys: K ): { [key in K[number]]: Ref } { return Object.fromEntries(keys.map((x) => [x, pluckRef(sourceRef, x)])) as any } export const refWithCallbackOnChange = ( initialValue: T, callback: (value: UnwrapRef) => void ) => { const targetRef = ref(initialValue) watch(targetRef, (value) => { callback(value) }) return targetRef }