seitu
Version:
26 lines (25 loc) • 1.03 kB
JavaScript
import { createReadableSubscription, createSubscription } from "../subscription/index.mjs";
//#region src/core/computed/index.ts
function createComputed(source, transform) {
const sources = Array.isArray(source) ? source : [source];
const isSingle = !Array.isArray(source);
const { subscribe, notify } = createSubscription({ onFirstSubscribe() {
const unsubscribes = sources.map((s) => s.subscribe(() => notify()));
return () => unsubscribes.forEach((u) => u());
} });
const evaluate = (values) => transform(isSingle ? values[0] : values);
let lastInputs;
let lastOutput;
const get = () => {
const inputs = sources.map((s) => s.get());
if (!lastInputs || lastInputs.some((v, i) => v !== inputs[i])) {
lastOutput = evaluate(inputs);
lastInputs = inputs;
}
return lastOutput;
};
const getServer = sources.every((s) => s.getServer) ? () => evaluate(sources.map((s) => s.getServer())) : void 0;
return createReadableSubscription(get, subscribe, notify, getServer);
}
//#endregion
export { createComputed };