ts-action-operators
Version:
TypeScript action operators for NgRx and redux-observable
56 lines (55 loc) • 2.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.act = void 0;
var rxjs_1 = require("rxjs");
var operators_1 = require("rxjs/operators");
function act(projectOrConfig, optionalError) {
var config = typeof projectOrConfig === "function"
? {
error: optionalError,
project: projectOrConfig,
}
: projectOrConfig;
var complete = config.complete, error = config.error, _a = config.operator, operator = _a === void 0 ? operators_1.concatMap : _a, project = config.project, unsubscribe = config.unsubscribe;
return function (source) {
return rxjs_1.defer(function () {
var subject = new rxjs_1.Subject();
return rxjs_1.merge(source.pipe(operator(function (action, index) {
return rxjs_1.defer(function () {
var completed = false;
var errored = false;
var projectedCount = 0;
return project(action, index).pipe(operators_1.materialize(), operators_1.map(function (notification) {
switch (notification.kind) {
case "E":
errored = true;
return {
kind: "N",
value: error(notification.error, action),
};
case "C":
completed = true;
return complete
? {
kind: "N",
value: complete(projectedCount, action),
}
: undefined;
default:
++projectedCount;
return notification;
}
}), operators_1.filter(isDefined), operators_1.dematerialize(), operators_1.finalize(function () {
if (!completed && !errored && unsubscribe) {
subject.next(unsubscribe(projectedCount, action));
}
}));
});
})), subject);
});
};
}
exports.act = act;
function isDefined(value) {
return value !== undefined;
}