ts-action-operators
Version:
TypeScript action operators for NgRx and redux-observable
52 lines (51 loc) • 2.37 kB
JavaScript
import { defer, merge, Subject } from "rxjs";
import { concatMap, dematerialize, filter, finalize, map, materialize, } from "rxjs/operators";
export 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 ? concatMap : _a, project = config.project, unsubscribe = config.unsubscribe;
return function (source) {
return defer(function () {
var subject = new Subject();
return merge(source.pipe(operator(function (action, index) {
return defer(function () {
var completed = false;
var errored = false;
var projectedCount = 0;
return project(action, index).pipe(materialize(), 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;
}
}), filter(isDefined), dematerialize(), finalize(function () {
if (!completed && !errored && unsubscribe) {
subject.next(unsubscribe(projectedCount, action));
}
}));
});
})), subject);
});
};
}
function isDefined(value) {
return value !== undefined;
}