caminho
Version:
Tool for creating efficient data pipelines in a JavaScript environment
37 lines • 1.72 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) {
var provides = reduceParams.provides, keep = reduceParams.keep, seed = reduceParams.seed;
var immutableSeed = Object.freeze(seed);
var lastBag = {};
function wrappedReduce(acc, valueBag, index, runId) {
var startedAt = new Date();
loggers.onStepStarted([valueBag]);
var renewedAcc = index === 0 ? structuredClone(immutableSeed) : acc;
try {
var 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 === null || pendingDataControl === void 0 ? void 0 : pendingDataControl.decrement(runId);
}
}
return function operatorApplierWithRunId(runId) {
return function operatorApplier(observable) {
return observable
.pipe(reduceRxJs(function (acc, valueBag, index) { return wrappedReduce(acc, valueBag, index, runId); }, seed))
.pipe(map(function (reduceResult) {
pendingDataControl === null || pendingDataControl === void 0 ? void 0 : pendingDataControl.increment(runId);
return getNewValueBag(pick(lastBag, keep !== null && keep !== void 0 ? keep : []), provides, reduceResult);
}));
};
};
}
//# sourceMappingURL=reduce.js.map