import { from, Observable } from "rxjs" import { mergeMap } from "rxjs/operators" export type Maybe = T | undefined export function cache(fn: () => Promise): Observable { let promise: Promise | undefined = undefined return new Observable(subscriber => { if (promise === undefined) { promise = fn() } promise .then(value => subscriber.next(value)) .catch(error => { promise = undefined subscriber.error(error) }) }) } export function promiseToObservable(promise: Promise>): Observable { return from(promise).pipe( mergeMap(it => it), ) } export function noop() {}