json-processing
Version:
JSON Processing Tool
51 lines (50 loc) • 2.25 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.groupJoinOnKey = void 0;
const lodash_1 = __importDefault(require("lodash"));
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const keySelector = (e) => e.key;
const elementSelector = (e) => e;
function groupJoin(rightStream, leftKeySelector = keySelector, rightKeySelector = keySelector, leftElementSelector = elementSelector, rightElementSelector = elementSelector) {
return (source) => {
return source.pipe(operators_1.reduce((grouped, left) => toGroup(grouped, left), {}), operators_1.mergeMap((left) => new rxjs_1.Observable((observer) => {
rightStream.subscribe({
next: rightElement => {
try {
const key = rightKeySelector(rightElement);
const leftJoin = left[key];
if (lodash_1.default.isEmpty(leftJoin))
return;
for (let i = leftJoin.length - 1; i >= 0; i--) {
observer.next({
key: key,
left: leftElementSelector(leftJoin[i]),
right: rightElementSelector(rightElement)
});
}
}
catch (e) {
observer.error(e);
}
},
error: (err) => observer.error(err),
complete: () => observer.complete()
});
})));
function toGroup(grouped, left) {
const key = leftKeySelector(left);
(grouped[key] || (grouped[key] = [])).push(left);
return grouped;
}
};
}
exports.default = groupJoin;
function groupJoinOnKey(rightStream, key, leftElementSelector, rightElementSelector) {
return groupJoin(rightStream, left => left[key], right => right[key], leftElementSelector, rightElementSelector);
}
exports.groupJoinOnKey = groupJoinOnKey;
;