UNPKG

vuse-rx

Version:

First-class rxjs support for Vue 3

70 lines (62 loc) 2.36 kB
import { ObservableInput, from, Subscription, Observable } from 'rxjs'; import { Ref, ref } from 'vue'; import { untilUnmounted } from '../operators/until'; type Subscribers<R, E> = { next: R; error: E; }; type Refs<R, E> = { [key in keyof Subscribers<R, E>]: Ref<Subscribers<R, E>[key]>; } & { subscription: Subscription; value$: Observable<R>; }; /** * Creates two refs from an observable input (promise, iterable, observable and alike): * - `next` - is set when the resulting observable resolves * - `error` - is set when the resulting observable errors * * Until the observable emits, the refs will contain `undefined`. * * @param input * A value to create an observable from.\ * This observable is then going to be listened to in order to set the refs. */ export function refsFrom<R, E = unknown>(input: ObservableInput<R>): Refs<R | undefined, E | undefined>; /** * Creates two refs from an observable input (promise, iterable, observable and alike): * - `next` - is set when the resulting observable resolves * - `error` - is set when the resulting observable errors * * @param input * A value to create an observable from.\ * This observable is then going to be listened to in order to set the refs. * * @param defaultValues * A map of default values for each ref. */ export function refsFrom<R, E = unknown>(input: ObservableInput<R>, defaultValues: { next: R }): Refs<R, E | undefined>; /** * Creates two refs from an observable input (promise, iterable, observable and alike): * - `next` - is set when the resulting observable resolves * - `error` - is set when the resulting observable errors * * @param input * A value to create an observable from.\ * This observable is then going to be listened to in order to set the refs. * * @param defaultValues * A map of default values for each ref. */ export function refsFrom<R, E>(input: ObservableInput<R>, defaultValues: Subscribers<R, E>): Refs<R, E>; export function refsFrom(input: ObservableInput<any>, defaultValues: Partial<Subscribers<any, any>> = {}) { const next = ref(defaultValues.next); const error = ref(defaultValues.error); const value$ = untilUnmounted(from(input)); return { next, error, value$, subscription: value$.subscribe({ next: v => next.value = v, error: v => error.value = v, }) }; }