UNPKG

ix

Version:

The Interactive Extensions for JavaScript

74 lines (72 loc) 3.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.innerJoin = exports.JoinAsyncIterable = void 0; const tslib_1 = require("tslib"); const asynciterablex_js_1 = require("../asynciterablex.js"); const _grouping_js_1 = require("./_grouping.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 JoinAsyncIterable 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)); if (map.has(outerKey)) { for (const innerElement of map.get(outerKey)) { yield yield tslib_1.__await(yield tslib_1.__await(this._resultSelector(outerElement, innerElement, 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.JoinAsyncIterable = JoinAsyncIterable; /** * Correlates the elements of two sequences based on matching keys. * * @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: TInner, signal?: AbortSignal) => TResult | Promise<TResult>)} resultSelector A function to create a result element * from two matching elements. * @returns {OperatorAsyncFunction<TOuter, TResult>} An async-iterable sequence that has elements that are obtained by performing an inner join * on two sequences. */ function innerJoin(inner, outerSelector, innerSelector, resultSelector) { return function innerJoinOperatorFunction(outer) { return new JoinAsyncIterable(outer, inner, outerSelector, innerSelector, resultSelector); }; } exports.innerJoin = innerJoin; //# sourceMappingURL=innerjoin.js.map