UNPKG

xstream

Version:

An extremely intuitive, small, and fast functional reactive stream library for JavaScript

142 lines 4.29 kB
"use strict"; var core_1 = require('../core'); var DOMEventProducer = (function () { function DOMEventProducer(node, eventType, useCapture) { this.node = node; this.eventType = eventType; this.useCapture = useCapture; this.type = 'fromEvent'; } DOMEventProducer.prototype._start = function (out) { this.listener = function (e) { return out._n(e); }; this.node.addEventListener(this.eventType, this.listener, this.useCapture); }; DOMEventProducer.prototype._stop = function () { this.node.removeEventListener(this.eventType, this.listener, this.useCapture); this.listener = null; }; return DOMEventProducer; }()); exports.DOMEventProducer = DOMEventProducer; var NodeEventProducer = (function () { function NodeEventProducer(node, eventName) { this.node = node; this.eventName = eventName; this.type = 'fromEvent'; } NodeEventProducer.prototype._start = function (out) { this.listener = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i - 0] = arguments[_i]; } return (args.length > 1) ? out._n(args) : out._n(args[0]); }; this.node.addListener(this.eventName, this.listener); }; NodeEventProducer.prototype._stop = function () { this.node.removeListener(this.eventName, this.listener); this.listener = null; }; return NodeEventProducer; }()); exports.NodeEventProducer = NodeEventProducer; function isEmitter(element) { return element.emit && element.addListener; } /** * Creates a stream based on either: * - DOM events with the name `eventName` from a provided target node * - Events with the name `eventName` from a provided NodeJS EventEmitter * * When creating a stream from EventEmitters, if the source event has more than * one argument all the arguments will be aggregated into an array in the * result stream. * * Marble diagram: * * ```text * fromEvent(element, eventName) * ---ev--ev----ev--------------- * ``` * * Examples: * * ```js * import fromEvent from 'xstream/extra/fromEvent' * * const stream = fromEvent(document.querySelector('.button'), 'click') * .mapTo('Button clicked!') * * stream.addListener({ * next: i => console.log(i), * error: err => console.error(err), * complete: () => console.log('completed') * }) * ``` * * ```text * > 'Button clicked!' * > 'Button clicked!' * > 'Button clicked!' * ``` * * ```js * import fromEvent from 'xstream/extra/fromEvent' * import {EventEmitter} from 'events' * * const MyEmitter = new EventEmitter() * const stream = fromEvent(MyEmitter, 'foo') * * stream.addListener({ * next: i => console.log(i), * error: err => console.error(err), * complete: () => console.log('completed') * }) * * MyEmitter.emit('foo', 'bar') * ``` * * ```text * > 'bar' * ``` * * ```js * import fromEvent from 'xstream/extra/fromEvent' * import {EventEmitter} from 'events' * * const MyEmitter = new EventEmitter() * const stream = fromEvent(MyEmitter, 'foo') * * stream.addListener({ * next: i => console.log(i), * error: err => console.error(err), * complete: () => console.log('completed') * }) * * MyEmitter.emit('foo', 'bar', 'baz', 'buzz') * ``` * * ```text * > ['bar', 'baz', 'buzz'] * ``` * * @param {EventTarget|EventEmitter} element The element upon which to listen. * @param {string} eventName The name of the event for which to listen. * @param {boolean?} useCapture An optional boolean that indicates that events of * this type will be dispatched to the registered listener before being * dispatched to any EventTarget beneath it in the DOM tree. Defaults to false. * @return {Stream} */ function fromEvent(element, eventName, useCapture) { if (useCapture === void 0) { useCapture = false; } if (isEmitter(element)) { return new core_1.Stream(new NodeEventProducer(element, eventName)); } else { return new core_1.Stream(new DOMEventProducer(element, eventName, useCapture)); } } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = fromEvent; //# sourceMappingURL=fromEvent.js.map