UNPKG

@reactivex/ix-es5-esm

Version:

The Interactive Extensions for JavaScript

63 lines (61 loc) 2.66 kB
import { __asyncGenerator, __await, __generator, __read, __spreadArray } from "tslib"; import { memoize } from './operators/memoize.js'; import { identity } from '../util/identity.js'; import { isFunction } from '../util/isiterable.js'; import { AsyncSink } from './asyncsink.js'; var isArray = Array.isArray; function callOrApply(fn, args) { return isArray(args) ? fn.apply(void 0, __spreadArray([], __read(args), false)) : fn(args); } /** * Creates async-iterable from an event emitter by adding handlers for both listening and unsubscribing from events. * * @template TSource The type of elements in the event emitter. * @param {(handler: (...args: any[]) => void) => void} addHandler The function to add a listener to the source. * @param {(handler: (...args: any[]) => void) => void} removeHandler The function to remove a listener from the source. * @returns {AsyncIterableX<TSource>} An async-iterable which contains the data from the underlying events as wrapped by the handlers. */ export function fromEventPattern(addHandler, removeHandler, resultSelector) { if (!isFunction(resultSelector)) { resultSelector = identity; } var sink = new AsyncSink(); var handler = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return sink.write(callOrApply(resultSelector, args)); }; addHandler(handler); var loop = function () { return __asyncGenerator(this, arguments, function () { var next; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, , 7, 8]); next = void 0; _a.label = 1; case 1: return [4 /*yield*/, __await(sink.next())]; case 2: if (!!(next = _a.sent()).done) return [3 /*break*/, 6]; return [4 /*yield*/, __await(next.value)]; case 3: return [4 /*yield*/, _a.sent()]; case 4: _a.sent(); _a.label = 5; case 5: return [3 /*break*/, 1]; case 6: return [3 /*break*/, 8]; case 7: removeHandler(handler); sink.end(); return [7 /*endfinally*/]; case 8: return [2 /*return*/]; } }); }); }; return memoize()(loop()); } //# sourceMappingURL=fromeventpattern.js.map