UNPKG

ts-action-operators

Version:

TypeScript action operators for NgRx and redux-observable

52 lines (51 loc) 2.37 kB
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; }