xstream
Version:
An extremely intuitive, small, and fast functional reactive stream library for JavaScript
142 lines • 4.29 kB
JavaScript
"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