nrgy
Version:
The library for reactive programming using efficient computing and MVC/MVVM patterns
92 lines (89 loc) • 2.03 kB
JavaScript
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
};