import { customRef, onBeforeUnmount, readonly, Ref, ref, watch, } from "@nuxtjs/composition-api" import { Observable, Subscription } from "rxjs" export function useReadonlyStream(stream$: Observable, initialValue: T) { let sub: Subscription | null = null onBeforeUnmount(() => { if (sub) { sub.unsubscribe() } }) const targetRef = ref(initialValue) as Ref sub = stream$.subscribe((value) => { targetRef.value = value }) return readonly(targetRef) } export function useStream( stream$: Observable, initialValue: T, setter: (val: T) => void ) { let sub: Subscription | null = null onBeforeUnmount(() => { if (sub) { sub.unsubscribe() } }) return customRef((track, trigger) => { let value = initialValue sub = stream$.subscribe((val) => { value = val trigger() }) return { get() { track() return value }, set(value: T) { trigger() setter(value) }, } }) } 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 }) }, } }) }