caminho
Version:
Tool for creating efficient data pipelines in a JavaScript environment
37 lines • 1.49 kB
JavaScript
import { map, reduce as reduceRxJs } from 'rxjs';
import { getNewValueBag } from '../utils/valueBag';
import { pick } from '../utils/pick';
export function reduce(reduceParams, loggers, pendingDataControl) {
const { provides, keep, seed } = reduceParams;
const immutableSeed = Object.freeze(seed);
let lastBag = {};
function wrappedReduce(acc, valueBag, index, runId) {
const startedAt = new Date();
loggers.onStepStarted([valueBag]);
const renewedAcc = index === 0 ? structuredClone(immutableSeed) : acc;
try {
const reduceResult = reduceParams.fn(renewedAcc, valueBag, index);
loggers.onStepFinished([valueBag], startedAt);
lastBag = valueBag;
return reduceResult;
}
catch (err) {
loggers.onStepFinished([valueBag], startedAt, err);
throw err;
}
finally {
pendingDataControl?.decrement(runId);
}
}
return function operatorApplierWithRunId(runId) {
return function operatorApplier(observable) {
return observable
.pipe(reduceRxJs((acc, valueBag, index) => wrappedReduce(acc, valueBag, index, runId), seed))
.pipe(map((reduceResult) => {
pendingDataControl?.increment(runId);
return getNewValueBag(pick(lastBag, keep ?? []), provides, reduceResult);
}));
};
};
}
//# sourceMappingURL=reduce.js.map