UNPKG

nrgy

Version:

The library for reactive programming using efficient computing and MVC/MVVM patterns

92 lines (89 loc) 2.03 kB
import { observe } from "./chunk-7KYKQ2FF.js"; import { createScope } from "./chunk-JYWBIFMU.js"; import { RUNTIME, compute, createAtomFromFunction, destroySignal, getAtomNode, signal } from "./chunk-6EESSQRU.js"; // src/rx-effects/query.ts import { skip } from "rxjs"; function toQuery(source) { return { get: () => RUNTIME.runAsUntracked(() => source()), value$: observe(source) }; } function fromQuery(query) { const onDestroyed = signal({ sync: true }); const scope = createScope(); scope.onDestroy(() => { onDestroyed(); destroySignal(onDestroyed); }); const state = scope.atom({ type: 0 /* value */ }); const changes$ = query.value$.pipe(skip(1)); scope.add( changes$.subscribe({ next: () => state.set({ type: 0 /* value */ }), error: (error) => state.set({ type: 1 /* error */, error }), complete: () => scope.destroy() }) ); const result = compute(() => { const current = state(); switch (current.type) { case 0 /* value */: return query.get(); case 1 /* error */: throw current.error; } }); const node = getAtomNode(result); return createAtomFromFunction(node, () => result(), { onDestroyed, destroy: () => scope.destroy(), asReadonly: () => result }); } // src/rx-effects/action.ts function toAction(source, options) { const action = (value) => source(value); action.event$ = observe(source, options); return action; } function fromAction(action) { let subscription; function unsubscribe() { subscription == null ? void 0 : subscription.unsubscribe(); subscription = void 0; } const s = signal({ onSubscribe: () => { if (!subscription) { subscription = action.event$.subscribe((value) => s(value)); } }, onUnsubscribe: (isEmpty) => { if (isEmpty) { unsubscribe(); } }, onDestroy: () => { unsubscribe(); } }); return s; } export { fromAction, fromQuery, toAction, toQuery };