@reactivex/ix-es5-esm
Version:
The Interactive Extensions for JavaScript
63 lines (61 loc) • 2.66 kB
JavaScript
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