caminho
Version:
Tool for creating efficient data pipelines in a JavaScript environment
40 lines • 1.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.reduce = reduce;
const rxjs_1 = require("rxjs");
const valueBag_1 = require("../utils/valueBag");
const pick_1 = require("../utils/pick");
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((0, rxjs_1.reduce)((acc, valueBag, index) => wrappedReduce(acc, valueBag, index, runId), seed))
.pipe((0, rxjs_1.map)((reduceResult) => {
pendingDataControl?.increment(runId);
return (0, valueBag_1.getNewValueBag)((0, pick_1.pick)(lastBag, keep ?? []), provides, reduceResult);
}));
};
};
}
//# sourceMappingURL=reduce.js.map