UNPKG

json-processing

Version:

JSON Processing Tool

51 lines (50 loc) 2.25 kB
"use strict"; 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; ;