UNPKG

@reactivex/ix-es2015-cjs

Version:

The Interactive Extensions for JavaScript

76 lines (74 loc) 3.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.groupJoin = exports.GroupJoinAsyncIterable = void 0; const tslib_1 = require("tslib"); const asynciterablex_js_1 = require("../asynciterablex.js"); const _grouping_js_1 = require("./_grouping.js"); const empty_js_1 = require("../empty.js"); const identity_js_1 = require("../../util/identity.js"); const withabort_js_1 = require("./withabort.js"); const aborterror_js_1 = require("../../aborterror.js"); /** @ignore */ class GroupJoinAsyncIterable extends asynciterablex_js_1.AsyncIterableX { constructor(outer, inner, outerSelector, innerSelector, resultSelector) { super(); this._outer = outer; this._inner = inner; this._outerSelector = outerSelector; this._innerSelector = innerSelector; this._resultSelector = resultSelector; } [Symbol.asyncIterator](signal) { return tslib_1.__asyncGenerator(this, arguments, function* _a() { var _b, e_1, _c, _d; (0, aborterror_js_1.throwIfAborted)(signal); const map = yield tslib_1.__await((0, _grouping_js_1.createGrouping)(this._inner, this._innerSelector, identity_js_1.identity, signal)); try { for (var _e = true, _f = tslib_1.__asyncValues((0, withabort_js_1.wrapWithAbort)(this._outer, signal)), _g; _g = yield tslib_1.__await(_f.next()), _b = _g.done, !_b; _e = true) { _d = _g.value; _e = false; const outerElement = _d; const outerKey = yield tslib_1.__await(this._outerSelector(outerElement, signal)); const innerElements = map.has(outerKey) ? map.get(outerKey) : (0, empty_js_1.empty)(); yield yield tslib_1.__await(yield tslib_1.__await(this._resultSelector(outerElement, asynciterablex_js_1.AsyncIterableX.as(innerElements), signal))); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (!_e && !_b && (_c = _f.return)) yield tslib_1.__await(_c.call(_f)); } finally { if (e_1) throw e_1.error; } } }); } } exports.GroupJoinAsyncIterable = GroupJoinAsyncIterable; /** * Correlates the elements of two async-iterable sequences based on equality of keys and groups the results. * * @template TOuter The type of the elements of the first async-iterable sequence. * @template TInner The type of the elements of the second async-iterable sequence. * @template TKey The type of the keys returned by the key selector functions. * @template TResult The type of the result elements. * @param {AsyncIterable<TInner>} inner The async-enumerable sequence to join to the first sequence. * @param {((value: TOuter, signal?: AbortSignal) => TKey | Promise<TKey>)} outerSelector A function to extract the join key from each * element of the first sequence. * @param {((value: TInner, signal?: AbortSignal) => TKey | Promise<TKey>)} innerSelector A function to extract the join key from each * element of the second sequence. * @param {(( * outer: TOuter, * inner: AsyncIterable<TInner>, * signal?: AbortSignal * ) => TResult | Promise<TResult>)} resultSelector A function to create a result element from an element from the first sequence and a * collection of matching elements from the second sequence. * @returns {OperatorAsyncFunction<TOuter, TResult>} An operator that returns an async-iterable sequence that contains the result elements * that are obtained by performing a grouped join on two sequences. */ function groupJoin(inner, outerSelector, innerSelector, resultSelector) { return function groupJoinOperatorFunction(outer) { return new GroupJoinAsyncIterable(outer, inner, outerSelector, innerSelector, resultSelector); }; } exports.groupJoin = groupJoin; //# sourceMappingURL=groupjoin.js.map