Skip to content

Instantly share code, notes, and snippets.

@Risto-Stevcev
Created March 28, 2016 14:20
Show Gist options
  • Save Risto-Stevcev/62881c9b9a60931f1bc9 to your computer and use it in GitHub Desktop.
Save Risto-Stevcev/62881c9b9a60931f1bc9 to your computer and use it in GitHub Desktop.
@motorcycle/http
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.HTTP = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define('@most/hold', ['exports', 'most/lib/source/MulticastSource'], factory);
} else if (typeof exports !== "undefined") {
factory(exports, require('most/lib/source/MulticastSource'));
} else {
var mod = {
exports: {}
};
factory(mod.exports, global.MulticastSource);
global.mostHold = mod.exports;
}
})(this, function (exports, _MulticastSource) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _MulticastSource2 = _interopRequireDefault(_MulticastSource);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var _createClass = (function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
})();
var hold = function hold(stream) {
return new stream.constructor(new _MulticastSource2.default(new Hold(stream.source)));
};
var Hold = (function () {
function Hold(source) {
_classCallCheck(this, Hold);
this.source = source;
this.time = -Infinity;
this.value = void 0;
}
_createClass(Hold, [{
key: 'run',
value: function run(sink, scheduler) {
if (sink._hold !== this) {
sink._hold = this;
sink._holdAdd = sink.add;
sink.add = holdAdd;
sink._holdEvent = sink.event;
sink.event = holdEvent;
}
return this.source.run(sink, scheduler);
}
}]);
return Hold;
})();
function holdAdd(sink) {
var len = this._holdAdd(sink);
if (this._hold.time >= 0) {
sink.event(this._hold.time, this._hold.value);
}
return len;
}
function holdEvent(t, x) {
if (t >= this._hold.time) {
this._hold.time = t;
this._hold.value = x;
}
return this._holdEvent(t, x);
}
exports.default = hold;
});
},{"most/lib/source/MulticastSource":55}],2:[function(require,module,exports){
/**
* Expose `Emitter`.
*/
module.exports = Emitter;
/**
* Initialize a new `Emitter`.
*
* @api public
*/
function Emitter(obj) {
if (obj) return mixin(obj);
};
/**
* Mixin the emitter properties.
*
* @param {Object} obj
* @return {Object}
* @api private
*/
function mixin(obj) {
for (var key in Emitter.prototype) {
obj[key] = Emitter.prototype[key];
}
return obj;
}
/**
* Listen on the given `event` with `fn`.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter.prototype.on =
Emitter.prototype.addEventListener = function(event, fn){
this._callbacks = this._callbacks || {};
(this._callbacks['$' + event] = this._callbacks['$' + event] || [])
.push(fn);
return this;
};
/**
* Adds an `event` listener that will be invoked a single
* time then automatically removed.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter.prototype.once = function(event, fn){
function on() {
this.off(event, on);
fn.apply(this, arguments);
}
on.fn = fn;
this.on(event, on);
return this;
};
/**
* Remove the given callback for `event` or all
* registered callbacks.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter.prototype.off =
Emitter.prototype.removeListener =
Emitter.prototype.removeAllListeners =
Emitter.prototype.removeEventListener = function(event, fn){
this._callbacks = this._callbacks || {};
// all
if (0 == arguments.length) {
this._callbacks = {};
return this;
}
// specific event
var callbacks = this._callbacks['$' + event];
if (!callbacks) return this;
// remove all handlers
if (1 == arguments.length) {
delete this._callbacks['$' + event];
return this;
}
// remove specific handler
var cb;
for (var i = 0; i < callbacks.length; i++) {
cb = callbacks[i];
if (cb === fn || cb.fn === fn) {
callbacks.splice(i, 1);
break;
}
}
return this;
};
/**
* Emit `event` with the given args.
*
* @param {String} event
* @param {Mixed} ...
* @return {Emitter}
*/
Emitter.prototype.emit = function(event){
this._callbacks = this._callbacks || {};
var args = [].slice.call(arguments, 1)
, callbacks = this._callbacks['$' + event];
if (callbacks) {
callbacks = callbacks.slice(0);
for (var i = 0, len = callbacks.length; i < len; ++i) {
callbacks[i].apply(this, args);
}
}
return this;
};
/**
* Return array of callbacks for `event`.
*
* @param {String} event
* @return {Array}
* @api public
*/
Emitter.prototype.listeners = function(event){
this._callbacks = this._callbacks || {};
return this._callbacks['$' + event] || [];
};
/**
* Check if this emitter has `event` handlers.
*
* @param {String} event
* @return {Boolean}
* @api public
*/
Emitter.prototype.hasListeners = function(event){
return !! this.listeners(event).length;
};
},{}],3:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = LinkedList;
/**
* Doubly linked list
* @constructor
*/
function LinkedList() {
this.head = null;
this.length = 0;
}
/**
* Add a node to the end of the list
* @param {{prev:Object|null, next:Object|null, dispose:function}} x node to add
*/
LinkedList.prototype.add = function(x) {
if(this.head !== null) {
this.head.prev = x;
x.next = this.head;
}
this.head = x;
++this.length;
};
/**
* Remove the provided node from the list
* @param {{prev:Object|null, next:Object|null, dispose:function}} x node to remove
*/
LinkedList.prototype.remove = function(x) {
--this.length;
if(x === this.head) {
this.head = this.head.next;
}
if(x.next !== null) {
x.next.prev = x.prev;
x.next = null;
}
if(x.prev !== null) {
x.prev.next = x.next;
x.prev = null;
}
};
/**
* @returns {boolean} true iff there are no nodes in the list
*/
LinkedList.prototype.isEmpty = function() {
return this.length === 0;
};
/**
* Dispose all nodes
* @returns {Promise} promise that fulfills when all nodes have been disposed,
* or rejects if an error occurs while disposing
*/
LinkedList.prototype.dispose = function() {
if(this.isEmpty()) {
return Promise.resolve();
}
var promises = [];
var x = this.head;
this.head = null;
this.length = 0;
while(x !== null) {
promises.push(x.dispose());
x = x.next;
}
return Promise.all(promises);
};
},{}],4:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
exports.isPromise = isPromise;
function isPromise(p) {
return p !== null && typeof p === 'object' && typeof p.then === 'function';
}
},{}],5:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
// Based on https://github.com/petkaantonov/deque
module.exports = Queue;
function Queue(capPow2) {
this._capacity = capPow2||32;
this._length = 0;
this._head = 0;
}
Queue.prototype.push = function (x) {
var len = this._length;
this._checkCapacity(len + 1);
var i = (this._head + len) & (this._capacity - 1);
this[i] = x;
this._length = len + 1;
};
Queue.prototype.shift = function () {
var head = this._head;
var x = this[head];
this[head] = void 0;
this._head = (head + 1) & (this._capacity - 1);
this._length--;
return x;
};
Queue.prototype.isEmpty = function() {
return this._length === 0;
};
Queue.prototype.length = function () {
return this._length;
};
Queue.prototype._checkCapacity = function (size) {
if (this._capacity < size) {
this._ensureCapacity(this._capacity << 1);
}
};
Queue.prototype._ensureCapacity = function (capacity) {
var oldCapacity = this._capacity;
this._capacity = capacity;
var last = this._head + this._length;
if (last > oldCapacity) {
copy(this, 0, this, oldCapacity, last & (oldCapacity - 1));
}
};
function copy(src, srcIndex, dst, dstIndex, len) {
for (var j = 0; j < len; ++j) {
dst[j + dstIndex] = src[j + srcIndex];
src[j + srcIndex] = void 0;
}
}
},{}],6:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = Stream;
function Stream(source) {
this.source = source;
}
},{}],7:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
exports.noop = noop;
exports.identity = identity;
exports.compose = compose;
exports.apply = apply;
exports.cons = cons;
exports.append = append;
exports.drop = drop;
exports.tail = tail;
exports.copy = copy;
exports.map = map;
exports.reduce = reduce;
exports.replace = replace;
exports.remove = remove;
exports.removeAll = removeAll;
exports.findIndex = findIndex;
exports.isArrayLike = isArrayLike;
function noop() {}
function identity(x) {
return x;
}
function compose(f, g) {
return function(x) {
return f(g(x));
};
}
function apply(f, x) {
return f(x);
}
function cons(x, array) {
var l = array.length;
var a = new Array(l + 1);
a[0] = x;
for(var i=0; i<l; ++i) {
a[i + 1] = array[i];
}
return a;
}
function append(x, a) {
var l = a.length;
var b = new Array(l+1);
for(var i=0; i<l; ++i) {
b[i] = a[i];
}
b[l] = x;
return b;
}
function drop(n, array) {
var l = array.length;
if(n >= l) {
return [];
}
l -= n;
var a = new Array(l);
for(var i=0; i<l; ++i) {
a[i] = array[n+i];
}
return a;
}
function tail(array) {
return drop(1, array);
}
function copy(array) {
var l = array.length;
var a = new Array(l);
for(var i=0; i<l; ++i) {
a[i] = array[i];
}
return a;
}
function map(f, array) {
var l = array.length;
var a = new Array(l);
for(var i=0; i<l; ++i) {
a[i] = f(array[i]);
}
return a;
}
function reduce(f, z, array) {
var r = z;
for(var i=0, l=array.length; i<l; ++i) {
r = f(r, array[i], i);
}
return r;
}
function replace(x, i, array) {
var l = array.length;
var a = new Array(l);
for(var j=0; j<l; ++j) {
a[j] = i === j ? x : array[j];
}
return a;
}
function remove(index, array) {
var l = array.length;
if(l === 0 || index >= array) { // exit early if index beyond end of array
return array;
}
if(l === 1) { // exit early if index in bounds and length === 1
return [];
}
return unsafeRemove(index, array, l-1);
}
function unsafeRemove(index, a, l) {
var b = new Array(l);
var i;
for(i=0; i<index; ++i) {
b[i] = a[i];
}
for(i=index; i<l; ++i) {
b[i] = a[i+1];
}
return b;
}
function removeAll(f, a) {
var l = a.length;
var b = new Array(l);
for(var x, i=0, j=0; i<l; ++i) {
x = a[i];
if(!f(x)) {
b[j] = x;
++j;
}
}
b.length = j;
return b;
}
function findIndex(x, a) {
for (var i = 0, l = a.length; i < l; ++i) {
if (x === a[i]) {
return i;
}
}
return -1;
}
function isArrayLike(x){
return x != null && typeof x.length === 'number' && typeof x !== 'function';
}
},{}],8:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Pipe = require('../sink/Pipe');
var runSource = require('../runSource');
var cons = require('./build').cons;
var noop = require('../base').noop;
exports.scan = scan;
exports.reduce = reduce;
/**
* Create a stream containing successive reduce results of applying f to
* the previous reduce result and the current stream item.
* @param {function(result:*, x:*):*} f reducer function
* @param {*} initial initial value
* @param {Stream} stream stream to scan
* @returns {Stream} new stream containing successive reduce results
*/
function scan(f, initial, stream) {
return cons(initial, new Stream(new Accumulate(ScanSink, f, initial, stream.source)));
}
function ScanSink(f, z, sink) {
this.f = f;
this.value = z;
this.sink = sink;
}
ScanSink.prototype.event = function(t, x) {
var f = this.f;
this.value = f(this.value, x);
this.sink.event(t, this.value);
};
ScanSink.prototype.error = Pipe.prototype.error;
ScanSink.prototype.end = Pipe.prototype.end;
/**
* Reduce a stream to produce a single result. Note that reducing an infinite
* stream will return a Promise that never fulfills, but that may reject if an error
* occurs.
* @param {function(result:*, x:*):*} f reducer function
* @param {*} initial initial value
* @param {Stream} stream to reduce
* @returns {Promise} promise for the file result of the reduce
*/
function reduce(f, initial, stream) {
return runSource.withDefaultScheduler(noop, new Accumulate(AccumulateSink, f, initial, stream.source));
}
function Accumulate(SinkType, f, z, source) {
this.SinkType = SinkType;
this.f = f;
this.value = z;
this.source = source;
}
Accumulate.prototype.run = function(sink, scheduler) {
return this.source.run(new this.SinkType(this.f, this.value, sink), scheduler);
};
function AccumulateSink(f, z, sink) {
this.f = f;
this.value = z;
this.sink = sink;
}
AccumulateSink.prototype.event = function(t, x) {
var f = this.f;
this.value = f(this.value, x);
this.sink.event(t, this.value);
};
AccumulateSink.prototype.error = Pipe.prototype.error;
AccumulateSink.prototype.end = function(t) {
this.sink.end(t, this.value);
};
},{"../Stream":6,"../base":7,"../runSource":43,"../sink/Pipe":52,"./build":10}],9:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var combine = require('./combine').combine;
var apply = require('../base').apply;
exports.ap = ap;
/**
* Assume fs is a stream containing functions, and apply the latest function
* in fs to the latest value in xs.
* fs: --f---------g--------h------>
* xs: -a-------b-------c-------d-->
* ap(fs, xs): --fa-----fb-gb---gc--hc--hd->
* @param {Stream} fs stream of functions to apply to the latest x
* @param {Stream} xs stream of values to which to apply all the latest f
* @returns {Stream} stream containing all the applications of fs to xs
*/
function ap(fs, xs) {
return combine(apply, fs, xs);
}
},{"../base":7,"./combine":11}],10:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var streamOf = require('../source/core').of;
var continueWith = require('./continueWith').continueWith;
exports.concat = concat;
exports.cycle = cycle;
exports.cons = cons;
/**
* @param {*} x value to prepend
* @param {Stream} stream
* @returns {Stream} new stream with x prepended
*/
function cons(x, stream) {
return concat(streamOf(x), stream);
}
/**
* @param {Stream} left
* @param {Stream} right
* @returns {Stream} new stream containing all events in left followed by all
* events in right. This *timeshifts* right to the end of left.
*/
function concat(left, right) {
return continueWith(function() {
return right;
}, left);
}
/**
* Tie stream into a circle, creating an infinite stream
* @param {Stream} stream
* @returns {Stream} new infinite stream
*/
function cycle(stream) {
return continueWith(function cycleNext() {
return cycle(stream);
}, stream);
}
},{"../source/core":57,"./continueWith":13}],11:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var transform = require('./transform');
var core = require('../source/core');
var Pipe = require('../sink/Pipe');
var IndexSink = require('../sink/IndexSink');
var mergeSources = require('./merge').mergeSources;
var dispose = require('../disposable/dispose');
var base = require('../base');
var invoke = require('../invoke');
var hasValue = IndexSink.hasValue;
//var map = base.map;
var tail = base.tail;
exports.combineArray = combineArray;
exports.combine = combine;
/**
* Combine latest events from all input streams
* @param {function(...events):*} f function to combine most recent events
* @returns {Stream} stream containing the result of applying f to the most recent
* event of each input stream, whenever a new event arrives on any stream.
*/
function combine(f /*, ...streams */) {
return combineArray(f, tail(arguments));
}
/**
* Combine latest events from all input streams
* @param {function(...events):*} f function to combine most recent events
* @param {[Stream]} streams most recent events
* @returns {Stream} stream containing the result of applying f to the most recent
* event of each input stream, whenever a new event arrives on any stream.
*/
function combineArray(f, streams) {
var l = streams.length;
return l === 0 ? core.empty()
: l === 1 ? transform.map(f, streams[0])
: new Stream(mergeSources(CombineSink, f, streams));
}
function CombineSink(disposables, sinks, sink, f) {
this.sink = sink;
this.disposables = disposables;
this.sinks = sinks;
this.f = f;
this.values = new Array(sinks.length);
this.ready = false;
this.activeCount = sinks.length;
}
CombineSink.prototype.error = Pipe.prototype.error;
CombineSink.prototype.event = function(t, indexedValue) {
if(!this.ready) {
this.ready = this.sinks.every(hasValue);
}
this.values[indexedValue.index] = indexedValue.value;
if(this.ready) {
this.sink.event(t, invoke(this.f, this.values));
}
};
CombineSink.prototype.end = function(t, indexedValue) {
dispose.tryDispose(t, this.disposables[indexedValue.index], this.sink);
if(--this.activeCount === 0) {
this.sink.end(t, indexedValue.value);
}
};
},{"../Stream":6,"../base":7,"../disposable/dispose":36,"../invoke":41,"../sink/IndexSink":50,"../sink/Pipe":52,"../source/core":57,"./merge":20,"./transform":31}],12:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var mergeConcurrently = require('./mergeConcurrently').mergeConcurrently;
var map = require('./transform').map;
exports.concatMap = concatMap;
/**
* Map each value in stream to a new stream, and concatenate them all
* stream: -a---b---cX
* f(a): 1-1-1-1X
* f(b): -2-2-2-2X
* f(c): -3-3-3-3X
* stream.concatMap(f): -1-1-1-1-2-2-2-2-3-3-3-3X
* @param {function(x:*):Stream} f function to map each value to a stream
* @param {Stream} stream
* @returns {Stream} new stream containing all events from each stream returned by f
*/
function concatMap(f, stream) {
return mergeConcurrently(1, map(f, stream));
}
},{"./mergeConcurrently":21,"./transform":31}],13:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
var dispose = require('../disposable/dispose');
var isPromise = require('../Promise').isPromise;
exports.continueWith = continueWith;
function continueWith(f, stream) {
return new Stream(new ContinueWith(f, stream.source));
}
function ContinueWith(f, source) {
this.f = f;
this.source = source;
}
ContinueWith.prototype.run = function(sink, scheduler) {
return new ContinueWithSink(this.f, this.source, sink, scheduler);
};
function ContinueWithSink(f, source, sink, scheduler) {
this.f = f;
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
this.disposable = dispose.once(source.run(this, scheduler));
}
ContinueWithSink.prototype.error = Sink.prototype.error;
ContinueWithSink.prototype.event = function(t, x) {
if(!this.active) {
return;
}
this.sink.event(t, x);
};
ContinueWithSink.prototype.end = function(t, x) {
if(!this.active) {
return;
}
var result = dispose.tryDispose(t, this.disposable, this.sink);
this.disposable = isPromise(result)
? dispose.promised(this._thenContinue(result, x))
: this._continue(this.f, x);
};
ContinueWithSink.prototype._thenContinue = function(p, x) {
var self = this;
return p.then(function () {
return self._continue(self.f, x);
});
};
ContinueWithSink.prototype._continue = function(f, x) {
return f(x).source.run(this.sink, this.scheduler);
};
ContinueWithSink.prototype.dispose = function() {
this.active = false;
return this.disposable.dispose();
};
},{"../Promise":4,"../Stream":6,"../disposable/dispose":36,"../sink/Pipe":52}],14:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
var dispose = require('../disposable/dispose');
var PropagateTask = require('../scheduler/PropagateTask');
exports.delay = delay;
/**
* @param {Number} delayTime milliseconds to delay each item
* @param {Stream} stream
* @returns {Stream} new stream containing the same items, but delayed by ms
*/
function delay(delayTime, stream) {
return delayTime <= 0 ? stream
: new Stream(new Delay(delayTime, stream.source));
}
function Delay(dt, source) {
this.dt = dt;
this.source = source;
}
Delay.prototype.run = function(sink, scheduler) {
var delaySink = new DelaySink(this.dt, sink, scheduler);
return dispose.all([delaySink, this.source.run(delaySink, scheduler)]);
};
function DelaySink(dt, sink, scheduler) {
this.dt = dt;
this.sink = sink;
this.scheduler = scheduler;
}
DelaySink.prototype.dispose = function() {
var self = this;
this.scheduler.cancelAll(function(task) {
return task.sink === self.sink;
});
};
DelaySink.prototype.event = function(t, x) {
this.scheduler.delay(this.dt, PropagateTask.event(x, this.sink));
};
DelaySink.prototype.end = function(t, x) {
this.scheduler.delay(this.dt, PropagateTask.end(x, this.sink));
};
DelaySink.prototype.error = Sink.prototype.error;
},{"../Stream":6,"../disposable/dispose":36,"../scheduler/PropagateTask":44,"../sink/Pipe":52}],15:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var ValueSource = require('../source/ValueSource');
var tryDispose = require('../disposable/dispose').tryDispose;
var tryEvent = require('../source/tryEvent');
var apply = require('../base').apply;
exports.flatMapError = recoverWith;
exports.recoverWith = recoverWith;
exports.throwError = throwError;
/**
* If stream encounters an error, recover and continue with items from stream
* returned by f.
* @param {function(error:*):Stream} f function which returns a new stream
* @param {Stream} stream
* @returns {Stream} new stream which will recover from an error by calling f
*/
function recoverWith(f, stream) {
return new Stream(new RecoverWith(f, stream.source));
}
/**
* Create a stream containing only an error
* @param {*} e error value, preferably an Error or Error subtype
* @returns {Stream} new stream containing only an error
*/
function throwError(e) {
return new Stream(new ValueSource(error, e));
}
function error(t, e, sink) {
sink.error(t, e);
}
function RecoverWith(f, source) {
this.f = f;
this.source = source;
}
RecoverWith.prototype.run = function(sink, scheduler) {
return new RecoverWithSink(this.f, this.source, sink, scheduler);
};
function RecoverWithSink(f, source, sink, scheduler) {
this.f = f;
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
this.disposable = source.run(this, scheduler);
}
RecoverWithSink.prototype.error = function(t, e) {
if(!this.active) {
return;
}
// TODO: forward dispose errors
tryDispose(t, this.disposable, this);
var stream = apply(this.f, e);
this.disposable = stream.source.run(this.sink, this.scheduler);
};
RecoverWithSink.prototype.event = function(t, x) {
if(!this.active) {
return;
}
tryEvent.tryEvent(t, x, this.sink);
};
RecoverWithSink.prototype.end = function(t, x) {
if(!this.active) {
return;
}
tryEvent.tryEnd(t, x, this.sink);
};
RecoverWithSink.prototype.dispose = function() {
this.active = false;
return this.disposable.dispose();
};
},{"../Stream":6,"../base":7,"../disposable/dispose":36,"../source/ValueSource":56,"../source/tryEvent":66}],16:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
var Filter = require('../fusion/Filter');
exports.filter = filter;
exports.skipRepeats = skipRepeats;
exports.skipRepeatsWith = skipRepeatsWith;
/**
* Retain only items matching a predicate
* @param {function(x:*):boolean} p filtering predicate called for each item
* @param {Stream} stream stream to filter
* @returns {Stream} stream containing only items for which predicate returns truthy
*/
function filter(p, stream) {
return new Stream(Filter.create(p, stream.source));
}
/**
* Skip repeated events, using === to detect duplicates
* @param {Stream} stream stream from which to omit repeated events
* @returns {Stream} stream without repeated events
*/
function skipRepeats(stream) {
return skipRepeatsWith(same, stream);
}
/**
* Skip repeated events using the provided equals function to detect duplicates
* @param {function(a:*, b:*):boolean} equals optional function to compare items
* @param {Stream} stream stream from which to omit repeated events
* @returns {Stream} stream without repeated events
*/
function skipRepeatsWith(equals, stream) {
return new Stream(new SkipRepeats(equals, stream.source));
}
function SkipRepeats(equals, source) {
this.equals = equals;
this.source = source;
}
SkipRepeats.prototype.run = function(sink, scheduler) {
return this.source.run(new SkipRepeatsSink(this.equals, sink), scheduler);
};
function SkipRepeatsSink(equals, sink) {
this.equals = equals;
this.sink = sink;
this.value = void 0;
this.init = true;
}
SkipRepeatsSink.prototype.end = Sink.prototype.end;
SkipRepeatsSink.prototype.error = Sink.prototype.error;
SkipRepeatsSink.prototype.event = function(t, x) {
if(this.init) {
this.init = false;
this.value = x;
this.sink.event(t, x);
} else if(!this.equals(this.value, x)) {
this.value = x;
this.sink.event(t, x);
}
};
function same(a, b) {
return a === b;
}
},{"../Stream":6,"../fusion/Filter":38,"../sink/Pipe":52}],17:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var mergeConcurrently = require('./mergeConcurrently').mergeConcurrently;
var map = require('./transform').map;
exports.flatMap = flatMap;
exports.join = join;
/**
* Map each value in the stream to a new stream, and merge it into the
* returned outer stream. Event arrival times are preserved.
* @param {function(x:*):Stream} f chaining function, must return a Stream
* @param {Stream} stream
* @returns {Stream} new stream containing all events from each stream returned by f
*/
function flatMap(f, stream) {
return join(map(f, stream));
}
/**
* Monadic join. Flatten a Stream<Stream<X>> to Stream<X> by merging inner
* streams to the outer. Event arrival times are preserved.
* @param {Stream<Stream<X>>} stream stream of streams
* @returns {Stream<X>} new stream containing all events of all inner streams
*/
function join(stream) {
return mergeConcurrently(Infinity, stream);
}
},{"./mergeConcurrently":21,"./transform":31}],18:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
var dispose = require('../disposable/dispose');
var PropagateTask = require('../scheduler/PropagateTask');
exports.throttle = throttle;
exports.debounce = debounce;
/**
* Limit the rate of events by suppressing events that occur too often
* @param {Number} period time to suppress events
* @param {Stream} stream
* @returns {Stream}
*/
function throttle(period, stream) {
return new Stream(new Throttle(period, stream.source));
}
function Throttle(period, source) {
this.dt = period;
this.source = source;
}
Throttle.prototype.run = function(sink, scheduler) {
return this.source.run(new ThrottleSink(this.dt, sink), scheduler);
};
function ThrottleSink(dt, sink) {
this.time = 0;
this.dt = dt;
this.sink = sink;
}
ThrottleSink.prototype.event = function(t, x) {
if(t >= this.time) {
this.time = t + this.dt;
this.sink.event(t, x);
}
};
ThrottleSink.prototype.end = Sink.prototype.end;
ThrottleSink.prototype.error = Sink.prototype.error;
/**
* Wait for a burst of events to subside and emit only the last event in the burst
* @param {Number} period events occuring more frequently than this
* will be suppressed
* @param {Stream} stream stream to debounce
* @returns {Stream} new debounced stream
*/
function debounce(period, stream) {
return new Stream(new Debounce(period, stream.source));
}
function Debounce(dt, source) {
this.dt = dt;
this.source = source;
}
Debounce.prototype.run = function(sink, scheduler) {
return new DebounceSink(this.dt, this.source, sink, scheduler);
};
function DebounceSink(dt, source, sink, scheduler) {
this.dt = dt;
this.sink = sink;
this.scheduler = scheduler;
this.value = void 0;
this.timer = null;
var sourceDisposable = source.run(this, scheduler);
this.disposable = dispose.all([this, sourceDisposable]);
}
DebounceSink.prototype.event = function(t, x) {
this._clearTimer();
this.value = x;
this.timer = this.scheduler.delay(this.dt, PropagateTask.event(x, this.sink));
};
DebounceSink.prototype.end = function(t, x) {
if(this._clearTimer()) {
this.sink.event(t, this.value);
this.value = void 0;
}
this.sink.end(t, x);
};
DebounceSink.prototype.error = function(t, x) {
this._clearTimer();
this.sink.error(t, x);
};
DebounceSink.prototype.dispose = function() {
this._clearTimer();
};
DebounceSink.prototype._clearTimer = function() {
if(this.timer === null) {
return false;
}
this.timer.cancel();
this.timer = null;
return true;
};
},{"../Stream":6,"../disposable/dispose":36,"../scheduler/PropagateTask":44,"../sink/Pipe":52}],19:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Pipe = require('../sink/Pipe');
exports.loop = loop;
/**
* Generalized feedback loop. Call a stepper function for each event. The stepper
* will be called with 2 params: the current seed and the an event value. It must
* return a new { seed, value } pair. The `seed` will be fed back into the next
* invocation of stepper, and the `value` will be propagated as the event value.
* @param {function(seed:*, value:*):{seed:*, value:*}} stepper loop step function
* @param {*} seed initial seed value passed to first stepper call
* @param {Stream} stream event stream
* @returns {Stream} new stream whose values are the `value` field of the objects
* returned by the stepper
*/
function loop(stepper, seed, stream) {
return new Stream(new Loop(stepper, seed, stream.source));
}
function Loop(stepper, seed, source) {
this.step = stepper;
this.seed = seed;
this.source = source;
}
Loop.prototype.run = function(sink, scheduler) {
return this.source.run(new LoopSink(this.step, this.seed, sink), scheduler);
};
function LoopSink(stepper, seed, sink) {
this.step = stepper;
this.seed = seed;
this.sink = sink;
}
LoopSink.prototype.error = Pipe.prototype.error;
LoopSink.prototype.event = function(t, x) {
var result = this.step(this.seed, x);
this.seed = result.seed;
this.sink.event(t, result.value);
};
LoopSink.prototype.end = function(t) {
this.sink.end(t, this.seed);
};
},{"../Stream":6,"../sink/Pipe":52}],20:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Pipe = require('../sink/Pipe');
var IndexSink = require('../sink/IndexSink');
var empty = require('../source/core').empty;
var dispose = require('../disposable/dispose');
var base = require('../base');
var copy = base.copy;
var map = base.map;
exports.merge = merge;
exports.mergeArray = mergeArray;
exports.mergeSources = mergeSources;
/**
* @returns {Stream} stream containing events from all streams in the argument
* list in time order. If two events are simultaneous they will be merged in
* arbitrary order.
*/
function merge(/*...streams*/) {
return mergeArray(copy(arguments));
}
/**
* @param {Array} streams array of stream to merge
* @returns {Stream} stream containing events from all input observables
* in time order. If two events are simultaneous they will be merged in
* arbitrary order.
*/
function mergeArray(streams) {
var l = streams.length;
return l === 0 ? empty()
: l === 1 ? streams[0]
: new Stream(mergeSources(MergeSink, void 0, streams));
}
function mergeSources(Sink, arg, streams) {
return new Merge(Sink, arg, map(getSource, streams))
}
function getSource(stream) {
return stream.source;
}
function Merge(Sink, arg, sources) {
this.Sink = Sink;
this.arg = arg;
this.sources = sources;
}
Merge.prototype.run = function(sink, scheduler) {
var l = this.sources.length;
var disposables = new Array(l);
var sinks = new Array(l);
var mergeSink = new this.Sink(disposables, sinks, sink, this.arg);
for(var indexSink, i=0; i<l; ++i) {
indexSink = sinks[i] = new IndexSink(i, mergeSink);
disposables[i] = this.sources[i].run(indexSink, scheduler);
}
return dispose.all(disposables);
};
function MergeSink(disposables, sinks, sink) {
this.sink = sink;
this.disposables = disposables;
this.activeCount = sinks.length;
}
MergeSink.prototype.error = Pipe.prototype.error;
MergeSink.prototype.event = function(t, indexValue) {
this.sink.event(t, indexValue.value);
};
MergeSink.prototype.end = function(t, indexedValue) {
dispose.tryDispose(t, this.disposables[indexedValue.index], this.sink);
if(--this.activeCount === 0) {
this.sink.end(t, indexedValue.value);
}
};
},{"../Stream":6,"../base":7,"../disposable/dispose":36,"../sink/IndexSink":50,"../sink/Pipe":52,"../source/core":57}],21:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var dispose = require('../disposable/dispose');
var LinkedList = require('../LinkedList');
exports.mergeConcurrently = mergeConcurrently;
function mergeConcurrently(concurrency, stream) {
return new Stream(new MergeConcurrently(concurrency, stream.source));
}
function MergeConcurrently(concurrency, source) {
this.concurrency = concurrency;
this.source = source;
}
MergeConcurrently.prototype.run = function(sink, scheduler) {
return new Outer(this.concurrency, this.source, sink, scheduler);
};
function Outer(concurrency, source, sink, scheduler) {
this.concurrency = concurrency;
this.sink = sink;
this.scheduler = scheduler;
this.pending = [];
this.current = new LinkedList();
this.disposable = dispose.once(source.run(this, scheduler));
this.active = true;
}
Outer.prototype.event = function(t, x) {
this._addInner(t, x);
};
Outer.prototype._addInner = function(t, stream) {
if(this.current.length < this.concurrency) {
this._startInner(t, stream);
} else {
this.pending.push(stream);
}
};
Outer.prototype._startInner = function(t, stream) {
var innerSink = new Inner(t, this, this.sink);
this.current.add(innerSink);
innerSink.disposable = stream.source.run(innerSink, this.scheduler);
};
Outer.prototype.end = function(t, x) {
this.active = false;
this.disposable.dispose();
this._checkEnd(t, x);
};
Outer.prototype.error = function(t, e) {
this.active = false;
this.sink.error(t, e);
};
Outer.prototype.dispose = function() {
this.active = false;
this.pending.length = 0;
return Promise.all([this.disposable.dispose(), this.current.dispose()]);
};
Outer.prototype._endInner = function(t, x, inner) {
this.current.remove(inner);
dispose.tryDispose(t, inner, this);
if(this.pending.length === 0) {
this._checkEnd(t, x);
} else {
this._startInner(t, this.pending.shift());
}
};
Outer.prototype._checkEnd = function(t, x) {
if(!this.active && this.current.isEmpty()) {
this.sink.end(t, x);
}
};
function Inner(time, outer, sink) {
this.prev = this.next = null;
this.time = time;
this.outer = outer;
this.sink = sink;
this.disposable = void 0;
}
Inner.prototype.event = function(t, x) {
this.sink.event(Math.max(t, this.time), x);
};
Inner.prototype.end = function(t, x) {
this.outer._endInner(Math.max(t, this.time), x, this);
};
Inner.prototype.error = function(t, e) {
this.outer.error(Math.max(t, this.time), e);
};
Inner.prototype.dispose = function() {
return this.disposable.dispose();
};
},{"../LinkedList":3,"../Stream":6,"../disposable/dispose":36}],22:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
/** @contributor Maciej Ligenza */
var Stream = require('../Stream');
var MulticastSource = require('../source/MulticastSource');
exports.multicast = multicast;
/**
* Transform the stream into a multicast stream, allowing it to be shared
* more efficiently by many observers, without causing multiple invocation
* of internal machinery. Multicast is idempotent:
* stream.multicast() === stream.multicast().multicast()
* @param {Stream} stream to ensure is multicast.
* @returns {Stream} new stream which will multicast events to all observers.
*/
function multicast(stream) {
var source = stream.source;
return source instanceof MulticastSource ? stream
: new Stream(new MulticastSource(source));
}
},{"../Stream":6,"../source/MulticastSource":55}],23:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var runSource = require('../runSource');
var noop = require('../base').noop;
exports.observe = observe;
exports.drain = drain;
/**
* Observe all the event values in the stream in time order. The
* provided function `f` will be called for each event value
* @param {function(x:T):*} f function to call with each event value
* @param {Stream<T>} stream stream to observe
* @return {Promise} promise that fulfills after the stream ends without
* an error, or rejects if the stream ends with an error.
*/
function observe(f, stream) {
return runSource.withDefaultScheduler(f, stream.source);
}
/**
* "Run" a stream by
* @param stream
* @return {*}
*/
function drain(stream) {
return runSource.withDefaultScheduler(noop, stream.source);
}
},{"../base":7,"../runSource":43}],24:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var fatal = require('../fatalError');
exports.fromPromise = fromPromise;
exports.awaitPromises = awaitPromises;
/**
* Create a stream containing only the promise's fulfillment
* value at the time it fulfills.
* @param {Promise<T>} p promise
* @return {Stream<T>} stream containing promise's fulfillment value.
* If the promise rejects, the stream will error
*/
function fromPromise(p) {
return new Stream(new PromiseSource(p));
}
function PromiseSource(p) {
this.promise = p;
}
PromiseSource.prototype.run = function(sink, scheduler) {
return new PromiseProducer(this.promise, sink, scheduler);
};
function PromiseProducer(p, sink, scheduler) {
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
var self = this;
Promise.resolve(p).then(function(x) {
self._emit(self.scheduler.now(), x);
}).catch(function(e) {
self._error(self.scheduler.now(), e);
});
}
PromiseProducer.prototype._emit = function(t, x) {
if(!this.active) {
return;
}
this.sink.event(t, x);
this.sink.end(t, void 0);
};
PromiseProducer.prototype._error = function(t, e) {
if(!this.active) {
return;
}
this.sink.error(t, e);
};
PromiseProducer.prototype.dispose = function() {
this.active = false;
};
/**
* Turn a Stream<Promise<T>> into Stream<T> by awaiting each promise.
* Event order is preserved.
* @param {Stream<Promise<T>>} stream
* @return {Stream<T>} stream of fulfillment values. The stream will
* error if any promise rejects.
*/
function awaitPromises(stream) {
return new Stream(new Await(stream.source));
}
function Await(source) {
this.source = source;
}
Await.prototype.run = function(sink, scheduler) {
return this.source.run(new AwaitSink(sink, scheduler), scheduler);
};
function AwaitSink(sink, scheduler) {
this.sink = sink;
this.scheduler = scheduler;
this.queue = Promise.resolve();
var self = this;
// Pre-create closures, to avoid creating them per event
this._eventBound = function(x) {
self.sink.event(self.scheduler.now(), x);
};
this._endBound = function(x) {
self.sink.end(self.scheduler.now(), x);
};
this._errorBound = function(e) {
self.sink.error(self.scheduler.now(), e);
};
}
AwaitSink.prototype.event = function(t, promise) {
var self = this;
this.queue = this.queue.then(function() {
return self._event(promise);
}).catch(this._errorBound);
};
AwaitSink.prototype.end = function(t, x) {
var self = this;
this.queue = this.queue.then(function() {
return self._end(x);
}).catch(this._errorBound);
};
AwaitSink.prototype.error = function(t, e) {
var self = this;
// Don't resolve error values, propagate directly
this.queue = this.queue.then(function() {
return self._errorBound(e);
}).catch(fatal);
};
AwaitSink.prototype._event = function(promise) {
return promise.then(this._eventBound);
};
AwaitSink.prototype._end = function(x) {
return Promise.resolve(x).then(this._endBound);
};
},{"../Stream":6,"../fatalError":37}],25:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Pipe = require('../sink/Pipe');
var dispose = require('../disposable/dispose');
var base = require('../base');
var invoke = require('../invoke');
exports.sample = sample;
exports.sampleWith = sampleWith;
exports.sampleArray = sampleArray;
/**
* When an event arrives on sampler, emit the result of calling f with the latest
* values of all streams being sampled
* @param {function(...values):*} f function to apply to each set of sampled values
* @param {Stream} sampler streams will be sampled whenever an event arrives
* on sampler
* @returns {Stream} stream of sampled and transformed values
*/
function sample(f, sampler /*, ...streams */) {
return sampleArray(f, sampler, base.drop(2, arguments));
}
/**
* When an event arrives on sampler, emit the latest event value from stream.
* @param {Stream} sampler stream of events at whose arrival time
* stream's latest value will be propagated
* @param {Stream} stream stream of values
* @returns {Stream} sampled stream of values
*/
function sampleWith(sampler, stream) {
return new Stream(new Sampler(base.identity, sampler.source, [stream.source]));
}
function sampleArray(f, sampler, streams) {
return new Stream(new Sampler(f, sampler.source, base.map(getSource, streams)));
}
function getSource(stream) {
return stream.source;
}
function Sampler(f, sampler, sources) {
this.f = f;
this.sampler = sampler;
this.sources = sources;
}
Sampler.prototype.run = function(sink, scheduler) {
var l = this.sources.length;
var disposables = new Array(l+1);
var sinks = new Array(l);
var sampleSink = new SampleSink(this.f, sinks, sink);
for(var hold, i=0; i<l; ++i) {
hold = sinks[i] = new Hold(sampleSink);
disposables[i] = this.sources[i].run(hold, scheduler);
}
disposables[i] = this.sampler.run(sampleSink, scheduler);
return dispose.all(disposables);
};
function Hold(sink) {
this.sink = sink;
this.hasValue = false;
}
Hold.prototype.event = function(t, x) {
this.value = x;
this.hasValue = true;
this.sink._notify(this);
};
Hold.prototype.end = base.noop;
Hold.prototype.error = Pipe.prototype.error;
function SampleSink(f, sinks, sink) {
this.f = f;
this.sinks = sinks;
this.sink = sink;
this.active = false;
}
SampleSink.prototype._notify = function() {
if(!this.active) {
this.active = this.sinks.every(hasValue);
}
};
SampleSink.prototype.event = function(t) {
if(this.active) {
this.sink.event(t, invoke(this.f, base.map(getValue, this.sinks)));
}
};
SampleSink.prototype.end = Pipe.prototype.end;
SampleSink.prototype.error = Pipe.prototype.error;
function hasValue(hold) {
return hold.hasValue;
}
function getValue(hold) {
return hold.value;
}
},{"../Stream":6,"../base":7,"../disposable/dispose":36,"../invoke":41,"../sink/Pipe":52}],26:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
var core = require('../source/core');
var dispose = require('../disposable/dispose');
exports.take = take;
exports.skip = skip;
exports.slice = slice;
exports.takeWhile = takeWhile;
exports.skipWhile = skipWhile;
/**
* @param {number} n
* @param {Stream} stream
* @returns {Stream} new stream containing only up to the first n items from stream
*/
function take(n, stream) {
return slice(0, n, stream);
}
/**
* @param {number} n
* @param {Stream} stream
* @returns {Stream} new stream with the first n items removed
*/
function skip(n, stream) {
return slice(n, Infinity, stream);
}
/**
* Slice a stream by index. Negative start/end indexes are not supported
* @param {number} start
* @param {number} end
* @param {Stream} stream
* @returns {Stream} stream containing items where start <= index < end
*/
function slice(start, end, stream) {
return end <= start ? core.empty()
: new Stream(new Slice(start, end, stream.source));
}
function Slice(min, max, source) {
this.skip = min;
this.take = max - min;
this.source = source;
}
Slice.prototype.run = function(sink, scheduler) {
return new SliceSink(this.skip, this.take, this.source, sink, scheduler);
};
function SliceSink(skip, take, source, sink, scheduler) {
this.skip = skip;
this.take = take;
this.sink = sink;
this.disposable = dispose.once(source.run(this, scheduler));
}
SliceSink.prototype.end = Sink.prototype.end;
SliceSink.prototype.error = Sink.prototype.error;
SliceSink.prototype.event = function(t, x) {
if(this.skip > 0) {
this.skip -= 1;
return;
}
if(this.take === 0) {
return;
}
this.take -= 1;
this.sink.event(t, x);
if(this.take === 0) {
this.dispose();
this.sink.end(t, x);
}
};
SliceSink.prototype.dispose = function() {
return this.disposable.dispose();
};
function takeWhile(p, stream) {
return new Stream(new TakeWhile(p, stream.source));
}
function TakeWhile(p, source) {
this.p = p;
this.source = source;
}
TakeWhile.prototype.run = function(sink, scheduler) {
return new TakeWhileSink(this.p, this.source, sink, scheduler);
};
function TakeWhileSink(p, source, sink, scheduler) {
this.p = p;
this.sink = sink;
this.active = true;
this.disposable = dispose.once(source.run(this, scheduler));
}
TakeWhileSink.prototype.end = Sink.prototype.end;
TakeWhileSink.prototype.error = Sink.prototype.error;
TakeWhileSink.prototype.event = function(t, x) {
if(!this.active) {
return;
}
var p = this.p;
this.active = p(x);
if(this.active) {
this.sink.event(t, x);
} else {
this.dispose();
this.sink.end(t, x);
}
};
TakeWhileSink.prototype.dispose = function() {
return this.disposable.dispose();
};
function skipWhile(p, stream) {
return new Stream(new SkipWhile(p, stream.source));
}
function SkipWhile(p, source) {
this.p = p;
this.source = source;
}
SkipWhile.prototype.run = function(sink, scheduler) {
return this.source.run(new SkipWhileSink(this.p, sink), scheduler);
};
function SkipWhileSink(p, sink) {
this.p = p;
this.sink = sink;
this.skipping = true;
}
SkipWhileSink.prototype.end = Sink.prototype.end;
SkipWhileSink.prototype.error = Sink.prototype.error;
SkipWhileSink.prototype.event = function(t, x) {
if(this.skipping) {
var p = this.p;
this.skipping = p(x);
if(this.skipping) {
return;
}
}
this.sink.event(t, x);
};
},{"../Stream":6,"../disposable/dispose":36,"../sink/Pipe":52,"../source/core":57}],27:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var MulticastSource = require('../source/MulticastSource');
var until = require('./timeslice').takeUntil;
var mergeConcurrently = require('./mergeConcurrently').mergeConcurrently;
var map = require('./transform').map;
exports.switch = switchLatest;
/**
* Given a stream of streams, return a new stream that adopts the behavior
* of the most recent inner stream.
* @param {Stream} stream of streams on which to switch
* @returns {Stream} switching stream
*/
function switchLatest(stream) {
var upstream = new Stream(new MulticastSource(stream.source));
return mergeConcurrently(1, map(untilNext, upstream));
function untilNext(s) {
return until(upstream, s);
}
}
},{"../Stream":6,"../source/MulticastSource":55,"./mergeConcurrently":21,"./timeslice":28,"./transform":31}],28:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Pipe = require('../sink/Pipe');
var dispose = require('../disposable/dispose');
var join = require('../combinator/flatMap').join;
var noop = require('../base').noop;
exports.during = during;
exports.takeUntil = takeUntil;
exports.skipUntil = skipUntil;
function takeUntil(signal, stream) {
return new Stream(new Until(signal.source, stream.source));
}
function skipUntil(signal, stream) {
return new Stream(new Since(signal.source, stream.source));
}
function during(timeWindow, stream) {
return takeUntil(join(timeWindow), skipUntil(timeWindow, stream));
}
function Until(maxSignal, source) {
this.maxSignal = maxSignal;
this.source = source;
}
Until.prototype.run = function(sink, scheduler) {
var min = new Bound(-Infinity, sink);
var max = new UpperBound(this.maxSignal, sink, scheduler);
var disposable = this.source.run(new TimeWindowSink(min, max, sink), scheduler);
return dispose.all([min, max, disposable]);
};
function Since(minSignal, source) {
this.minSignal = minSignal;
this.source = source;
}
Since.prototype.run = function(sink, scheduler) {
var min = new LowerBound(this.minSignal, sink, scheduler);
var max = new Bound(Infinity, sink);
var disposable = this.source.run(new TimeWindowSink(min, max, sink), scheduler);
return dispose.all([min, max, disposable]);
};
function Bound(value, sink) {
this.value = value;
this.sink = sink;
}
Bound.prototype.error = Pipe.prototype.error;
Bound.prototype.event = noop;
Bound.prototype.end = noop;
Bound.prototype.dispose = noop;
function TimeWindowSink(min, max, sink) {
this.min = min;
this.max = max;
this.sink = sink;
}
TimeWindowSink.prototype.event = function(t, x) {
if(t >= this.min.value && t < this.max.value) {
this.sink.event(t, x);
}
};
TimeWindowSink.prototype.error = Pipe.prototype.error;
TimeWindowSink.prototype.end = Pipe.prototype.end;
function LowerBound(signal, sink, scheduler) {
this.value = Infinity;
this.sink = sink;
this.disposable = signal.run(this, scheduler);
}
LowerBound.prototype.event = function(t /*, x */) {
if(t < this.value) {
this.value = t;
}
};
LowerBound.prototype.end = noop;
LowerBound.prototype.error = Pipe.prototype.error;
LowerBound.prototype.dispose = function() {
return this.disposable.dispose();
};
function UpperBound(signal, sink, scheduler) {
this.value = Infinity;
this.sink = sink;
this.disposable = signal.run(this, scheduler);
}
UpperBound.prototype.event = function(t, x) {
if(t < this.value) {
this.value = t;
this.sink.end(t, x);
}
};
UpperBound.prototype.end = noop;
UpperBound.prototype.error = Pipe.prototype.error;
UpperBound.prototype.dispose = function() {
return this.disposable.dispose();
};
},{"../Stream":6,"../base":7,"../combinator/flatMap":17,"../disposable/dispose":36,"../sink/Pipe":52}],29:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Sink = require('../sink/Pipe');
exports.timestamp = timestamp;
function timestamp(stream) {
return new Stream(new Timestamp(stream.source));
}
function Timestamp(source) {
this.source = source;
}
Timestamp.prototype.run = function(sink, scheduler) {
return this.source.run(new TimestampSink(sink), scheduler);
};
function TimestampSink(sink) {
this.sink = sink;
}
TimestampSink.prototype.end = Sink.prototype.end;
TimestampSink.prototype.error = Sink.prototype.error;
TimestampSink.prototype.event = function(t, x) {
this.sink.event(t, { time: t, value: x });
};
},{"../Stream":6,"../sink/Pipe":52}],30:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
exports.transduce = transduce;
/**
* Transform a stream by passing its events through a transducer.
* @param {function} transducer transducer function
* @param {Stream} stream stream whose events will be passed through the
* transducer
* @return {Stream} stream of events transformed by the transducer
*/
function transduce(transducer, stream) {
return new Stream(new Transduce(transducer, stream.source));
}
function Transduce(transducer, source) {
this.transducer = transducer;
this.source = source;
}
Transduce.prototype.run = function(sink, scheduler) {
var xf = this.transducer(new Transformer(sink));
return this.source.run(new TransduceSink(getTxHandler(xf), sink), scheduler);
};
function TransduceSink(adapter, sink) {
this.xf = adapter;
this.sink = sink;
}
TransduceSink.prototype.event = function(t, x) {
var next = this.xf.step(t, x);
return this.xf.isReduced(next)
? this.sink.end(t, this.xf.getResult(next))
: next;
};
TransduceSink.prototype.end = function(t, x) {
return this.xf.result(x);
};
TransduceSink.prototype.error = function(t, e) {
return this.sink.error(t, e);
};
function Transformer(sink) {
this.time = -Infinity;
this.sink = sink;
}
Transformer.prototype['@@transducer/init'] = Transformer.prototype.init = function() {};
Transformer.prototype['@@transducer/step'] = Transformer.prototype.step = function(t, x) {
if(!isNaN(t)) {
this.time = Math.max(t, this.time);
}
return this.sink.event(this.time, x);
};
Transformer.prototype['@@transducer/result'] = Transformer.prototype.result = function(x) {
return this.sink.end(this.time, x);
};
/**
* Given an object supporting the new or legacy transducer protocol,
* create an adapter for it.
* @param {object} tx transform
* @returns {TxAdapter|LegacyTxAdapter}
*/
function getTxHandler(tx) {
return typeof tx['@@transducer/step'] === 'function'
? new TxAdapter(tx)
: new LegacyTxAdapter(tx);
}
/**
* Adapter for new official transducer protocol
* @param {object} tx transform
* @constructor
*/
function TxAdapter(tx) {
this.tx = tx;
}
TxAdapter.prototype.step = function(t, x) {
return this.tx['@@transducer/step'](t, x);
};
TxAdapter.prototype.result = function(x) {
return this.tx['@@transducer/result'](x);
};
TxAdapter.prototype.isReduced = function(x) {
return x != null && x['@@transducer/reduced'];
};
TxAdapter.prototype.getResult = function(x) {
return x['@@transducer/value'];
};
/**
* Adapter for older transducer protocol
* @param {object} tx transform
* @constructor
*/
function LegacyTxAdapter(tx) {
this.tx = tx;
}
LegacyTxAdapter.prototype.step = function(t, x) {
return this.tx.step(t, x);
};
LegacyTxAdapter.prototype.result = function(x) {
return this.tx.result(x);
};
LegacyTxAdapter.prototype.isReduced = function(x) {
return x != null && x.__transducers_reduced__;
};
LegacyTxAdapter.prototype.getResult = function(x) {
return x.value;
};
},{"../Stream":6}],31:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var Map = require('../fusion/Map');
exports.map = map;
exports.constant = constant;
exports.tap = tap;
/**
* Transform each value in the stream by applying f to each
* @param {function(*):*} f mapping function
* @param {Stream} stream stream to map
* @returns {Stream} stream containing items transformed by f
*/
function map(f, stream) {
return new Stream(Map.create(f, stream.source));
}
/**
* Replace each value in the stream with x
* @param {*} x
* @param {Stream} stream
* @returns {Stream} stream containing items replaced with x
*/
function constant(x, stream) {
return map(function() {
return x;
}, stream);
}
/**
* Perform a side effect for each item in the stream
* @param {function(x:*):*} f side effect to execute for each item. The
* return value will be discarded.
* @param {Stream} stream stream to tap
* @returns {Stream} new stream containing the same items as this stream
*/
function tap(f, stream) {
return map(function(x) {
f(x);
return x;
}, stream);
}
},{"../Stream":6,"../fusion/Map":40}],32:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var transform = require('./transform');
var core = require('../source/core');
var Sink = require('../sink/Pipe');
var IndexSink = require('../sink/IndexSink');
var dispose = require('../disposable/dispose');
var base = require('../base');
var invoke = require('../invoke');
var Queue = require('../Queue');
var map = base.map;
var tail = base.tail;
exports.zip = zip;
exports.zipArray = zipArray;
/**
* Combine streams pairwise (or tuple-wise) by index by applying f to values
* at corresponding indices. The returned stream ends when any of the input
* streams ends.
* @param {function} f function to combine values
* @returns {Stream} new stream with items at corresponding indices combined
* using f
*/
function zip(f /*,...streams */) {
return zipArray(f, tail(arguments));
}
/**
* Combine streams pairwise (or tuple-wise) by index by applying f to values
* at corresponding indices. The returned stream ends when any of the input
* streams ends.
* @param {function} f function to combine values
* @param {[Stream]} streams streams to zip using f
* @returns {Stream} new stream with items at corresponding indices combined
* using f
*/
function zipArray(f, streams) {
return streams.length === 0 ? core.empty()
: streams.length === 1 ? transform.map(f, streams[0])
: new Stream(new Zip(f, map(getSource, streams)));
}
function getSource(stream) {
return stream.source;
}
function Zip(f, sources) {
this.f = f;
this.sources = sources;
}
Zip.prototype.run = function(sink, scheduler) {
var l = this.sources.length;
var disposables = new Array(l);
var sinks = new Array(l);
var buffers = new Array(l);
var zipSink = new ZipSink(this.f, buffers, sinks, sink);
for(var indexSink, i=0; i<l; ++i) {
buffers[i] = new Queue();
indexSink = sinks[i] = new IndexSink(i, zipSink);
disposables[i] = this.sources[i].run(indexSink, scheduler);
}
return dispose.all(disposables);
};
function ZipSink(f, buffers, sinks, sink) {
this.f = f;
this.sinks = sinks;
this.sink = sink;
this.buffers = buffers;
}
ZipSink.prototype.event = function(t, indexedValue) {
var buffers = this.buffers;
var buffer = buffers[indexedValue.index];
buffer.push(indexedValue.value);
if(buffer.length() === 1) {
if(!ready(this.buffers)) {
return;
}
emitZipped(this.f, t, buffers, this.sink);
if (ended(this.buffers, this.sinks)) {
this.sink.end(t, void 0);
}
}
};
ZipSink.prototype.end = function(t, indexedValue) {
var buffer = this.buffers[indexedValue.index];
if(buffer.isEmpty()) {
this.sink.end(t, indexedValue.value);
}
};
ZipSink.prototype.error = Sink.prototype.error;
function emitZipped (f, t, buffers, sink) {
sink.event(t, invoke(f, map(head, buffers)));
}
function head(buffer) {
return buffer.shift();
}
function ended(buffers, sinks) {
for(var i=0, l=buffers.length; i<l; ++i) {
if(buffers[i].isEmpty() && !sinks[i].active) {
return true;
}
}
return false;
}
function ready(buffers) {
for(var i=0, l=buffers.length; i<l; ++i) {
if(buffers[i].isEmpty()) {
return false;
}
}
return true;
}
},{"../Queue":5,"../Stream":6,"../base":7,"../disposable/dispose":36,"../invoke":41,"../sink/IndexSink":50,"../sink/Pipe":52,"../source/core":57,"./transform":31}],33:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = defer;
function defer(task) {
return Promise.resolve(task).then(runTask);
}
function runTask(task) {
try {
return task.run();
} catch(e) {
return task.error(e);
}
}
},{}],34:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = Disposable;
/**
* Create a new Disposable which will dispose its underlying resource.
* @param {function} dispose function
* @param {*?} data any data to be passed to disposer function
* @constructor
*/
function Disposable(dispose, data) {
this._dispose = dispose;
this._data = data;
}
Disposable.prototype.dispose = function() {
return this._dispose(this._data);
};
},{}],35:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = SettableDisposable;
function SettableDisposable() {
this.disposable = void 0;
this.disposed = false;
this._resolve = void 0;
var self = this;
this.result = new Promise(function(resolve) {
self._resolve = resolve;
});
}
SettableDisposable.prototype.setDisposable = function(disposable) {
if(this.disposable !== void 0) {
throw new Error('setDisposable called more than once');
}
this.disposable = disposable;
if(this.disposed) {
this._resolve(disposable.dispose());
}
};
SettableDisposable.prototype.dispose = function() {
if(this.disposed) {
return this.result;
}
this.disposed = true;
if(this.disposable !== void 0) {
this.result = this.disposable.dispose();
}
return this.result;
};
},{}],36:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Disposable = require('./Disposable');
var SettableDisposable = require('./SettableDisposable');
var isPromise = require('../Promise').isPromise;
var base = require('../base');
var map = base.map;
var identity = base.identity;
exports.tryDispose = tryDispose;
exports.create = create;
exports.once = once;
exports.empty = empty;
exports.all = all;
exports.settable = settable;
exports.promised = promised;
/**
* Call disposable.dispose. If it returns a promise, catch promise
* error and forward it through the provided sink.
* @param {number} t time
* @param {{dispose: function}} disposable
* @param {{error: function}} sink
* @return {*} result of disposable.dispose
*/
function tryDispose(t, disposable, sink) {
var result = disposeSafely(disposable);
return isPromise(result)
? result.catch(function (e) {
sink.error(t, e);
})
: result;
}
/**
* Create a new Disposable which will dispose its underlying resource
* at most once.
* @param {function} dispose function
* @param {*?} data any data to be passed to disposer function
* @return {Disposable}
*/
function create(dispose, data) {
return once(new Disposable(dispose, data));
}
/**
* Create a noop disposable. Can be used to satisfy a Disposable
* requirement when no actual resource needs to be disposed.
* @return {Disposable|exports|module.exports}
*/
function empty() {
return new Disposable(identity, void 0);
}
/**
* Create a disposable that will dispose all input disposables in parallel.
* @param {Array<Disposable>} disposables
* @return {Disposable}
*/
function all(disposables) {
return create(disposeAll, disposables);
}
function disposeAll(disposables) {
return Promise.all(map(disposeSafely, disposables));
}
function disposeSafely(disposable) {
try {
return disposable.dispose();
} catch(e) {
return Promise.reject(e);
}
}
/**
* Create a disposable from a promise for another disposable
* @param {Promise<Disposable>} disposablePromise
* @return {Disposable}
*/
function promised(disposablePromise) {
return create(disposePromise, disposablePromise);
}
function disposePromise(disposablePromise) {
return disposablePromise.then(disposeOne);
}
function disposeOne(disposable) {
return disposable.dispose();
}
/**
* Create a disposable proxy that allows its underlying disposable to
* be set later.
* @return {SettableDisposable}
*/
function settable() {
return new SettableDisposable();
}
/**
* Wrap an existing disposable (which may not already have been once()d)
* so that it will only dispose its underlying resource at most once.
* @param {{ dispose: function() }} disposable
* @return {Disposable} wrapped disposable
*/
function once(disposable) {
return new Disposable(disposeMemoized, memoized(disposable));
}
function disposeMemoized(memoized) {
if(!memoized.disposed) {
memoized.disposed = true;
memoized.value = disposeSafely(memoized.disposable);
memoized.disposable = void 0;
}
return memoized.value;
}
function memoized(disposable) {
return { disposed: false, disposable: disposable, value: void 0 };
}
},{"../Promise":4,"../base":7,"./Disposable":34,"./SettableDisposable":35}],37:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = fatalError;
function fatalError (e) {
setTimeout(function() {
throw e;
}, 0);
}
},{}],38:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Pipe = require('../sink/Pipe');
module.exports = Filter;
function Filter(p, source) {
this.p = p;
this.source = source;
}
/**
* Create a filtered source, fusing adjacent filter.filter if possible
* @param {function(x:*):boolean} p filtering predicate
* @param {{run:function}} source source to filter
* @returns {Filter} filtered source
*/
Filter.create = function createFilter(p, source) {
if (source instanceof Filter) {
return new Filter(and(source.p, p), source.source);
}
return new Filter(p, source);
};
Filter.prototype.run = function(sink, scheduler) {
return this.source.run(new FilterSink(this.p, sink), scheduler);
};
function FilterSink(p, sink) {
this.p = p;
this.sink = sink;
}
FilterSink.prototype.end = Pipe.prototype.end;
FilterSink.prototype.error = Pipe.prototype.error;
FilterSink.prototype.event = function(t, x) {
var p = this.p;
p(x) && this.sink.event(t, x);
};
function and(p, q) {
return function(x) {
return p(x) && q(x);
};
}
},{"../sink/Pipe":52}],39:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Pipe = require('../sink/Pipe');
module.exports = FilterMap;
function FilterMap(p, f, source) {
this.p = p;
this.f = f;
this.source = source;
}
FilterMap.prototype.run = function(sink, scheduler) {
return this.source.run(new FilterMapSink(this.p, this.f, sink), scheduler);
};
function FilterMapSink(p, f, sink) {
this.p = p;
this.f = f;
this.sink = sink;
}
FilterMapSink.prototype.event = function(t, x) {
var f = this.f;
var p = this.p;
p(x) && this.sink.event(t, f(x));
};
FilterMapSink.prototype.end = Pipe.prototype.end;
FilterMapSink.prototype.error = Pipe.prototype.error;
},{"../sink/Pipe":52}],40:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Pipe = require('../sink/Pipe');
var Filter = require('./Filter');
var FilterMap = require('./FilterMap');
var base = require('../base');
module.exports = Map;
function Map(f, source) {
this.f = f;
this.source = source;
}
/**
* Create a mapped source, fusing adjacent map.map, filter.map,
* and filter.map.map if possible
* @param {function(*):*} f mapping function
* @param {{run:function}} source source to map
* @returns {Map|FilterMap} mapped source, possibly fused
*/
Map.create = function createMap(f, source) {
if(source instanceof Map) {
return new Map(base.compose(f, source.f), source.source);
}
if(source instanceof Filter) {
return new FilterMap(source.p, f, source.source);
}
if(source instanceof FilterMap) {
return new FilterMap(source.p, base.compose(f, source.f), source.source);
}
return new Map(f, source);
};
Map.prototype.run = function(sink, scheduler) {
return this.source.run(new MapSink(this.f, sink), scheduler);
};
function MapSink(f, sink) {
this.f = f;
this.sink = sink;
}
MapSink.prototype.end = Pipe.prototype.end;
MapSink.prototype.error = Pipe.prototype.error;
MapSink.prototype.event = function(t, x) {
var f = this.f;
this.sink.event(t, f(x));
};
},{"../base":7,"../sink/Pipe":52,"./Filter":38,"./FilterMap":39}],41:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = invoke;
function invoke(f, args) {
/*eslint complexity: [2,7]*/
switch(args.length) {
case 0: return f();
case 1: return f(args[0]);
case 2: return f(args[0], args[1]);
case 3: return f(args[0], args[1], args[2]);
case 4: return f(args[0], args[1], args[2], args[3]);
case 5: return f(args[0], args[1], args[2], args[3], args[4]);
default:
return f.apply(void 0, args);
}
}
},{}],42:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
exports.isIterable = isIterable;
exports.getIterator = getIterator;
exports.makeIterable = makeIterable;
/*global Set, Symbol*/
var iteratorSymbol;
// Firefox ships a partial implementation using the name @@iterator.
// https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14
if (typeof Set === 'function' && typeof new Set()['@@iterator'] === 'function') {
iteratorSymbol = '@@iterator';
} else {
iteratorSymbol = typeof Symbol === 'function' && Symbol.iterator ||
'_es6shim_iterator_';
}
function isIterable(o) {
return typeof o[iteratorSymbol] === 'function';
}
function getIterator(o) {
return o[iteratorSymbol]();
}
function makeIterable(f, o) {
o[iteratorSymbol] = f;
return o;
}
},{}],43:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Observer = require('./sink/Observer');
var dispose = require('./disposable/dispose');
var defaultScheduler = require('./scheduler/defaultScheduler');
exports.withDefaultScheduler = withDefaultScheduler;
exports.withScheduler = withScheduler;
function withDefaultScheduler(f, source) {
return withScheduler(f, source, defaultScheduler);
}
function withScheduler(f, source, scheduler) {
return new Promise(function (resolve, reject) {
runSource(f, source, scheduler, resolve, reject);
});
}
function runSource(f, source, scheduler, resolve, reject) {
var disposable = dispose.settable();
var observer = new Observer(f, resolve, reject, disposable);
disposable.setDisposable(source.run(observer, scheduler));
}
},{"./disposable/dispose":36,"./scheduler/defaultScheduler":46,"./sink/Observer":51}],44:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var fatal = require('../fatalError');
module.exports = PropagateTask;
function PropagateTask(run, value, sink) {
this._run = run;
this.value = value;
this.sink = sink;
this.active = true;
}
PropagateTask.event = function(value, sink) {
return new PropagateTask(emit, value, sink);
};
PropagateTask.end = function(value, sink) {
return new PropagateTask(end, value, sink);
};
PropagateTask.error = function(value, sink) {
return new PropagateTask(error, value, sink);
};
PropagateTask.prototype.dispose = function() {
this.active = false;
};
PropagateTask.prototype.run = function(t) {
if(!this.active) {
return;
}
this._run(t, this.value, this.sink);
};
PropagateTask.prototype.error = function(t, e) {
if(!this.active) {
return fatal(e);
}
this.sink.error(t, e);
};
function error(t, e, sink) {
sink.error(t, e);
}
function emit(t, x, sink) {
sink.event(t, x);
}
function end(t, x, sink) {
sink.end(t, x);
}
},{"../fatalError":37}],45:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var base = require('./../base');
module.exports = Scheduler;
function ScheduledTask(delay, period, task, scheduler) {
this.time = delay;
this.period = period;
this.task = task;
this.scheduler = scheduler;
this.active = true;
}
ScheduledTask.prototype.run = function() {
return this.task.run(this.time);
};
ScheduledTask.prototype.error = function(e) {
return this.task.error(this.time, e);
};
ScheduledTask.prototype.cancel = function() {
this.scheduler.cancel(this);
return this.task.dispose();
};
function runTask(task) {
try {
return task.run();
} catch(e) {
return task.error(e);
}
}
function Scheduler(timer) {
this.timer = timer;
this._timer = null;
this._nextArrival = 0;
this._tasks = [];
var self = this;
this._runReadyTasksBound = function() {
self._runReadyTasks(self.now());
};
}
Scheduler.prototype.now = function() {
return this.timer.now();
};
Scheduler.prototype.asap = function(task) {
return this.schedule(0, -1, task);
};
Scheduler.prototype.delay = function(delay, task) {
return this.schedule(delay, -1, task);
};
Scheduler.prototype.periodic = function(period, task) {
return this.schedule(0, period, task);
};
Scheduler.prototype.schedule = function(delay, period, task) {
var now = this.now();
var st = new ScheduledTask(now + Math.max(0, delay), period, task, this);
insertByTime(st, this._tasks);
this._scheduleNextRun(now);
return st;
};
Scheduler.prototype.cancel = function(task) {
task.active = false;
var i = binarySearch(task.time, this._tasks);
if(i >= 0 && i < this._tasks.length) {
var at = base.findIndex(task, this._tasks[i].events);
this._tasks[i].events.splice(at, 1);
this._reschedule();
}
};
Scheduler.prototype.cancelAll = function(f) {
this._tasks = base.removeAll(f, this._tasks);
this._reschedule();
};
Scheduler.prototype._reschedule = function() {
if(this._tasks.length === 0) {
this._unschedule();
} else {
this._scheduleNextRun(this.now());
}
};
Scheduler.prototype._unschedule = function() {
this.timer.clearTimer(this._timer);
this._timer = null;
};
Scheduler.prototype._scheduleNextRun = function(now) {
if(this._tasks.length === 0) {
return;
}
var nextArrival = this._tasks[0].time;
if(this._timer === null) {
this._scheduleNextArrival(nextArrival, now);
} else if(nextArrival < this._nextArrival) {
this._unschedule();
this._scheduleNextArrival(nextArrival, now);
}
};
Scheduler.prototype._scheduleNextArrival = function(nextArrival, now) {
this._nextArrival = nextArrival;
var delay = Math.max(0, nextArrival - now);
this._timer = this.timer.setTimer(this._runReadyTasksBound, delay);
};
Scheduler.prototype._runReadyTasks = function(now) {
this._timer = null;
this._tasks = this._findAndRunTasks(now);
this._scheduleNextRun(this.now());
};
Scheduler.prototype._findAndRunTasks = function(now) {
var tasks = this._tasks;
var l = tasks.length;
var i = 0;
while(i < l && tasks[i].time <= now) {
++i;
}
this._tasks = tasks.slice(i);
// Run all ready tasks
for (var j = 0; j < i; ++j) {
this._tasks = runTasks(tasks[j], this._tasks);
}
return this._tasks;
};
function runTasks(timeslot, tasks) {
var events = timeslot.events;
for(var i=0; i<events.length; ++i) {
var task = events[i];
if(task.active) {
runTask(task);
// Reschedule periodic repeating tasks
// Check active again, since a task may have canceled itself
if(task.period >= 0) {
task.time = task.time + task.period;
insertByTime(task, tasks);
}
}
}
return tasks;
}
function insertByTime(task, timeslots) {
var l = timeslots.length;
if(l === 0) {
timeslots.push(newTimeslot(task.time, [task]));
return;
}
var i = binarySearch(task.time, timeslots);
if(i >= l) {
timeslots.push(newTimeslot(task.time, [task]));
} else if(task.time === timeslots[i].time) {
timeslots[i].events.push(task);
} else {
timeslots.splice(i, 0, newTimeslot(task.time, [task]));
}
}
function binarySearch(t, sortedArray) {
var lo = 0;
var hi = sortedArray.length;
var mid, y;
while (lo < hi) {
mid = Math.floor((lo + hi) / 2);
y = sortedArray[mid];
if (t === y.time) {
return mid;
} else if (t < y.time) {
hi = mid;
} else {
lo = mid + 1;
}
}
return hi;
}
function newTimeslot(t, events) {
return { time: t, events: events };
}
},{"./../base":7}],46:[function(require,module,exports){
(function (process){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Scheduler = require('./Scheduler');
var setTimeoutTimer = require('./timeoutTimer');
var nodeTimer = require('./nodeTimer');
var isNode = typeof process === 'object'
&& typeof process.nextTick === 'function';
module.exports = new Scheduler(isNode ? nodeTimer : setTimeoutTimer);
}).call(this,require('_process'))
},{"./Scheduler":45,"./nodeTimer":47,"./timeoutTimer":48,"_process":69}],47:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var defer = require('../defer');
/*global setTimeout, clearTimeout*/
function Task(f) {
this.f = f;
this.active = true;
}
Task.prototype.run = function() {
if(!this.active) {
return;
}
var f = this.f;
return f();
};
Task.prototype.error = function(e) {
throw e;
};
Task.prototype.cancel = function() {
this.active = false;
};
function runAsTask(f) {
var task = new Task(f);
defer(task);
return task;
}
module.exports = {
now: Date.now,
setTimer: function(f, dt) {
return dt <= 0 ? runAsTask(f) : setTimeout(f, dt);
},
clearTimer: function(t) {
return t instanceof Task ? t.cancel() : clearTimeout(t);
}
};
},{"../defer":33}],48:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
/*global setTimeout, clearTimeout*/
module.exports = {
now: Date.now,
setTimer: function(f, dt) {
return setTimeout(f, dt);
},
clearTimer: function(t) {
return clearTimeout(t);
}
};
},{}],49:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var defer = require('../defer');
module.exports = DeferredSink;
function DeferredSink(sink) {
this.sink = sink;
this.events = [];
this.length = 0;
this.active = true;
}
DeferredSink.prototype.event = function(t, x) {
if(!this.active) {
return;
}
if(this.length === 0) {
defer(new PropagateAllTask(this));
}
this.events[this.length++] = { time: t, value: x };
};
DeferredSink.prototype.error = function(t, e) {
this.active = false;
defer(new ErrorTask(t, e, this.sink));
};
DeferredSink.prototype.end = function(t, x) {
this.active = false;
defer(new EndTask(t, x, this.sink));
};
function PropagateAllTask(deferred) {
this.deferred = deferred;
}
PropagateAllTask.prototype.run = function() {
var p = this.deferred;
var events = p.events;
var sink = p.sink;
var event;
for(var i = 0, l = p.length; i<l; ++i) {
event = events[i];
sink.event(event.time, event.value);
events[i] = void 0;
}
p.length = 0;
};
PropagateAllTask.prototype.error = function(e) {
this.deferred.error(0, e);
};
function EndTask(t, x, sink) {
this.time = t;
this.value = x;
this.sink = sink;
}
EndTask.prototype.run = function() {
this.sink.end(this.time, this.value);
};
EndTask.prototype.error = function(e) {
this.sink.error(this.time, e);
};
function ErrorTask(t, e, sink) {
this.time = t;
this.value = e;
this.sink = sink;
}
ErrorTask.prototype.run = function() {
this.sink.error(this.time, this.value);
};
ErrorTask.prototype.error = function(e) {
throw e;
};
},{"../defer":33}],50:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Sink = require('./Pipe');
module.exports = IndexSink;
IndexSink.hasValue = hasValue;
function hasValue(indexSink) {
return indexSink.hasValue;
}
function IndexSink(i, sink) {
this.index = i;
this.sink = sink;
this.active = true;
this.hasValue = false;
this.value = void 0;
}
IndexSink.prototype.event = function(t, x) {
if(!this.active) {
return;
}
this.value = x;
this.hasValue = true;
this.sink.event(t, this);
};
IndexSink.prototype.end = function(t, x) {
if(!this.active) {
return;
}
this.active = false;
this.sink.end(t, { index: this.index, value: x });
};
IndexSink.prototype.error = Sink.prototype.error;
},{"./Pipe":52}],51:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = Observer;
/**
* Sink that accepts functions to apply to each event, and to end, and error
* signals.
* @constructor
*/
function Observer(event, end, error, disposable) {
this._event = event;
this._end = end;
this._error = error;
this._disposable = disposable;
this.active = true;
}
Observer.prototype.event = function(t, x) {
if (!this.active) {
return;
}
this._event(x);
};
Observer.prototype.end = function(t, x) {
if (!this.active) {
return;
}
this.active = false;
disposeThen(this._end, this._error, this._disposable, x);
};
Observer.prototype.error = function(t, e) {
this.active = false;
disposeThen(this._error, this._error, this._disposable, e);
};
function disposeThen(end, error, disposable, x) {
Promise.resolve(disposable.dispose()).then(function () {
end(x);
}, error);
}
},{}],52:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
module.exports = Pipe;
/**
* A sink mixin that simply forwards event, end, and error to
* another sink.
* @param sink
* @constructor
*/
function Pipe(sink) {
this.sink = sink;
}
Pipe.prototype.event = function(t, x) {
return this.sink.event(t, x);
};
Pipe.prototype.end = function(t, x) {
return this.sink.end(t, x);
};
Pipe.prototype.error = function(t, e) {
return this.sink.error(t, e);
};
},{}],53:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var DeferredSink = require('../sink/DeferredSink');
var dispose = require('../disposable/dispose');
var tryEvent = require('./tryEvent');
module.exports = EventEmitterSource;
function EventEmitterSource(event, source) {
this.event = event;
this.source = source;
}
EventEmitterSource.prototype.run = function(sink, scheduler) {
// NOTE: Because EventEmitter allows events in the same call stack as
// a listener is added, use a DeferredSink to buffer events
// until the stack clears, then propagate. This maintains most.js's
// invariant that no event will be delivered in the same call stack
// as an observer begins observing.
var dsink = new DeferredSink(sink);
function addEventVariadic(a) {
var l = arguments.length;
if(l > 1) {
var arr = new Array(l);
for(var i=0; i<l; ++i) {
arr[i] = arguments[i];
}
tryEvent.tryEvent(scheduler.now(), arr, dsink);
} else {
tryEvent.tryEvent(scheduler.now(), a, dsink);
}
}
this.source.addListener(this.event, addEventVariadic);
return dispose.create(disposeEventEmitter, { target: this, addEvent: addEventVariadic });
};
function disposeEventEmitter(info) {
var target = info.target;
target.source.removeListener(target.event, info.addEvent);
}
},{"../disposable/dispose":36,"../sink/DeferredSink":49,"./tryEvent":66}],54:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var dispose = require('../disposable/dispose');
var tryEvent = require('./tryEvent');
module.exports = EventTargetSource;
function EventTargetSource(event, source, capture) {
this.event = event;
this.source = source;
this.capture = capture;
}
EventTargetSource.prototype.run = function(sink, scheduler) {
function addEvent(e) {
tryEvent.tryEvent(scheduler.now(), e, sink);
}
this.source.addEventListener(this.event, addEvent, this.capture);
return dispose.create(disposeEventTarget,
{ target: this, addEvent: addEvent });
};
function disposeEventTarget(info) {
var target = info.target;
target.source.removeEventListener(target.event, info.addEvent, target.capture);
}
},{"../disposable/dispose":36,"./tryEvent":66}],55:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var base = require('../base');
module.exports = MulticastSource;
function MulticastSource(source) {
this.source = source;
this.sinks = [];
this._disposable = void 0;
}
MulticastSource.prototype.run = function(sink, scheduler) {
var n = this.add(sink);
if(n === 1) {
this._disposable = this.source.run(this, scheduler);
}
return new MulticastDisposable(this, sink);
};
MulticastSource.prototype._dispose = function() {
var disposable = this._disposable;
this._disposable = void 0;
return Promise.resolve(disposable).then(dispose);
};
function dispose(disposable) {
if(disposable === void 0) {
return;
}
return disposable.dispose();
}
function MulticastDisposable(source, sink) {
this.source = source;
this.sink = sink;
}
MulticastDisposable.prototype.dispose = function() {
var s = this.source;
var remaining = s.remove(this.sink);
return remaining === 0 && s._dispose();
};
MulticastSource.prototype.add = function(sink) {
this.sinks = base.append(sink, this.sinks);
return this.sinks.length;
};
MulticastSource.prototype.remove = function(sink) {
this.sinks = base.remove(base.findIndex(sink, this.sinks), this.sinks);
return this.sinks.length;
};
MulticastSource.prototype.event = function(t, x) {
var s = this.sinks;
if(s.length === 1) {
s[0].event(t, x);
return;
}
for(var i=0; i<s.length; ++i) {
s[i].event(t, x);
}
};
MulticastSource.prototype.end = function(t, x) {
var s = this.sinks;
if(s.length === 1) {
s[0].end(t, x);
return;
}
for(var i=0; i<s.length; ++i) {
s[i].end(t, x);
}
};
MulticastSource.prototype.error = function(t, e) {
var s = this.sinks;
if(s.length === 1) {
s[0].error(t, e);
return;
}
for (var i=0; i<s.length; ++i) {
s[i].error(t, e);
}
};
},{"../base":7}],56:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var PropagateTask = require('../scheduler/PropagateTask');
module.exports = ValueSource;
function ValueSource(emit, x) {
this.emit = emit;
this.value = x;
}
ValueSource.prototype.run = function(sink, scheduler) {
return new ValueProducer(this.emit, this.value, sink, scheduler);
};
function ValueProducer(emit, x, sink, scheduler) {
this.task = new PropagateTask(emit, x, sink);
scheduler.asap(this.task);
}
ValueProducer.prototype.dispose = function() {
return this.task.dispose();
};
},{"../scheduler/PropagateTask":44}],57:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var ValueSource = require('../source/ValueSource');
var dispose = require('../disposable/dispose');
var PropagateTask = require('../scheduler/PropagateTask');
exports.of = streamOf;
exports.empty = empty;
exports.never = never;
/**
* Stream containing only x
* @param {*} x
* @returns {Stream}
*/
function streamOf(x) {
return new Stream(new ValueSource(emit, x));
}
function emit(t, x, sink) {
sink.event(0, x);
sink.end(0, void 0);
}
/**
* Stream containing no events and ends immediately
* @returns {Stream}
*/
function empty() {
return EMPTY;
}
function EmptySource() {}
EmptySource.prototype.run = function(sink, scheduler) {
var task = PropagateTask.end(void 0, sink);
scheduler.asap(task);
return dispose.create(disposeEmpty, task);
};
function disposeEmpty(task) {
return task.dispose();
}
var EMPTY = new Stream(new EmptySource());
/**
* Stream containing no events and never ends
* @returns {Stream}
*/
function never() {
return NEVER;
}
function NeverSource() {}
NeverSource.prototype.run = function() {
return dispose.empty();
};
var NEVER = new Stream(new NeverSource());
},{"../Stream":6,"../disposable/dispose":36,"../scheduler/PropagateTask":44,"../source/ValueSource":56}],58:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var MulticastSource = require('./MulticastSource');
var DeferredSink = require('../sink/DeferredSink');
var tryEvent = require('./tryEvent');
exports.create = create;
function create(run) {
return new Stream(new MulticastSource(new SubscriberSource(run)));
}
function SubscriberSource(subscribe) {
this._subscribe = subscribe;
}
SubscriberSource.prototype.run = function(sink, scheduler) {
return new Subscription(new DeferredSink(sink), scheduler, this._subscribe);
};
function Subscription(sink, scheduler, subscribe) {
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
this._unsubscribe = this._init(subscribe);
}
Subscription.prototype._init = function(subscribe) {
var s = this;
try {
return subscribe(add, end, error);
} catch(e) {
error(e);
}
function add(x) {
s._add(x);
}
function end(x) {
s._end(x);
}
function error(e) {
s._error(e);
}
};
Subscription.prototype._add = function(x) {
if(!this.active) {
return;
}
tryEvent.tryEvent(this.scheduler.now(), x, this.sink);
};
Subscription.prototype._end = function(x) {
if(!this.active) {
return;
}
this.active = false;
tryEvent.tryEnd(this.scheduler.now(), x, this.sink);
};
Subscription.prototype._error = function(x) {
this.active = false;
this.sink.error(this.scheduler.now(), x);
};
Subscription.prototype.dispose = function() {
this.active = false;
if(typeof this._unsubscribe === 'function') {
return this._unsubscribe.call(void 0);
}
};
},{"../Stream":6,"../sink/DeferredSink":49,"./MulticastSource":55,"./tryEvent":66}],59:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var fromArray = require('./fromArray').fromArray;
var isIterable = require('../iterable').isIterable;
var fromIterable = require('./fromIterable').fromIterable;
var isArrayLike = require('../base').isArrayLike;
exports.from = from;
function from(a) {
if(Array.isArray(a) || isArrayLike(a)) {
return fromArray(a);
}
if(isIterable(a)) {
return fromIterable(a);
}
throw new TypeError('not iterable: ' + a);
}
},{"../base":7,"../iterable":42,"./fromArray":60,"./fromIterable":62}],60:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var PropagateTask = require('../scheduler/PropagateTask');
exports.fromArray = fromArray;
function fromArray (a) {
return new Stream(new ArraySource(a));
}
function ArraySource(a) {
this.array = a;
}
ArraySource.prototype.run = function(sink, scheduler) {
return new ArrayProducer(this.array, sink, scheduler);
};
function ArrayProducer(array, sink, scheduler) {
this.scheduler = scheduler;
this.task = new PropagateTask(runProducer, array, sink);
scheduler.asap(this.task);
}
ArrayProducer.prototype.dispose = function() {
return this.task.dispose();
};
function runProducer(t, array, sink) {
produce(this, array, sink);
}
function produce(task, array, sink) {
for(var i=0, l=array.length; i<l && task.active; ++i) {
sink.event(0, array[i]);
}
task.active && end();
function end() {
sink.end(0);
}
}
},{"../Stream":6,"../scheduler/PropagateTask":44}],61:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var MulticastSource = require('./MulticastSource');
var EventTargetSource = require('./EventTargetSource');
var EventEmitterSource = require('./EventEmitterSource');
exports.fromEvent = fromEvent;
/**
* Create a stream from an EventTarget, such as a DOM Node, or EventEmitter.
* @param {String} event event type name, e.g. 'click'
* @param {EventTarget|EventEmitter} source EventTarget or EventEmitter
* @param {boolean?} useCapture for DOM events, whether to use
* capturing--passed as 3rd parameter to addEventListener.
* @returns {Stream} stream containing all events of the specified type
* from the source.
*/
function fromEvent(event, source /*, useCapture = false */) {
var s;
if(typeof source.addEventListener === 'function' && typeof source.removeEventListener === 'function') {
var capture = arguments.length > 2 && !!arguments[2];
s = new MulticastSource(new EventTargetSource(event, source, capture));
} else if(typeof source.addListener === 'function' && typeof source.removeListener === 'function') {
s = new EventEmitterSource(event, source);
} else {
throw new Error('source must support addEventListener/removeEventListener or addListener/removeListener');
}
return new Stream(s);
}
},{"../Stream":6,"./EventEmitterSource":53,"./EventTargetSource":54,"./MulticastSource":55}],62:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var getIterator = require('../iterable').getIterator;
var PropagateTask = require('../scheduler/PropagateTask');
exports.fromIterable = fromIterable;
function fromIterable(iterable) {
return new Stream(new IterableSource(iterable));
}
function IterableSource(iterable) {
this.iterable = iterable;
}
IterableSource.prototype.run = function(sink, scheduler) {
return new IteratorProducer(getIterator(this.iterable), sink, scheduler);
};
function IteratorProducer(iterator, sink, scheduler) {
this.scheduler = scheduler;
this.iterator = iterator;
this.task = new PropagateTask(runProducer, this, sink);
scheduler.asap(this.task);
}
IteratorProducer.prototype.dispose = function() {
return this.task.dispose();
};
function runProducer(t, producer, sink) {
var x = producer.iterator.next();
if(x.done) {
sink.end(t, x.value);
} else {
sink.event(t, x.value);
}
producer.scheduler.asap(producer.task);
}
},{"../Stream":6,"../iterable":42,"../scheduler/PropagateTask":44}],63:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2014 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var base = require('../base');
exports.generate = generate;
/**
* Compute a stream using an *async* generator, which yields promises
* to control event times.
* @param f
* @returns {Stream}
*/
function generate(f /*, ...args */) {
return new Stream(new GenerateSource(f, base.tail(arguments)));
}
function GenerateSource(f, args) {
this.f = f;
this.args = args;
}
GenerateSource.prototype.run = function(sink, scheduler) {
return new Generate(this.f.apply(void 0, this.args), sink, scheduler);
};
function Generate(iterator, sink, scheduler) {
this.iterator = iterator;
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
var self = this;
function err(e) {
self.sink.error(self.scheduler.now(), e);
}
Promise.resolve(this).then(next).catch(err);
}
function next(generate, x) {
return generate.active ? handle(generate, generate.iterator.next(x)) : x;
}
function handle(generate, result) {
if (result.done) {
return generate.sink.end(generate.scheduler.now(), result.value);
}
return Promise.resolve(result.value).then(function (x) {
return emit(generate, x);
}, function(e) {
return error(generate, e);
});
}
function emit(generate, x) {
generate.sink.event(generate.scheduler.now(), x);
return next(generate, x);
}
function error(generate, e) {
return handle(generate, generate.iterator.throw(e));
}
Generate.prototype.dispose = function() {
this.active = false;
};
},{"../Stream":6,"../base":7}],64:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
exports.iterate = iterate;
/**
* Compute a stream by iteratively calling f to produce values
* Event times may be controlled by returning a Promise from f
* @param {function(x:*):*|Promise<*>} f
* @param {*} x initial value
* @returns {Stream}
*/
function iterate(f, x) {
return new Stream(new IterateSource(f, x));
}
function IterateSource(f, x) {
this.f = f;
this.value = x;
}
IterateSource.prototype.run = function(sink, scheduler) {
return new Iterate(this.f, this.value, sink, scheduler);
};
function Iterate(f, initial, sink, scheduler) {
this.f = f;
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
var x = initial;
var self = this;
function err(e) {
self.sink.error(self.scheduler.now(), e);
}
function start(iterate) {
return stepIterate(iterate, x);
}
Promise.resolve(this).then(start).catch(err);
}
Iterate.prototype.dispose = function() {
this.active = false;
};
function stepIterate(iterate, x) {
iterate.sink.event(iterate.scheduler.now(), x);
if(!iterate.active) {
return x;
}
var f = iterate.f;
return Promise.resolve(f(x)).then(function(y) {
return continueIterate(iterate, y);
});
}
function continueIterate(iterate, x) {
return !iterate.active ? iterate.value : stepIterate(iterate, x);
}
},{"../Stream":6}],65:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
var dispose = require('../disposable/dispose');
var MulticastSource = require('./MulticastSource');
var PropagateTask = require('../scheduler/PropagateTask');
exports.periodic = periodic;
/**
* Create a stream that emits the current time periodically
* @param {Number} period periodicity of events in millis
* @param {*) value value to emit each period
* @returns {Stream} new stream that emits the current time every period
*/
function periodic(period, value) {
return new Stream(new MulticastSource(new Periodic(period, value)));
}
function Periodic(period, value) {
this.period = period;
this.value = value;
}
Periodic.prototype.run = function(sink, scheduler) {
var task = scheduler.periodic(this.period, new PropagateTask(emit, this.value, sink));
return dispose.create(cancelTask, task);
};
function cancelTask(task) {
task.cancel();
}
function emit(t, x, sink) {
sink.event(t, x);
}
},{"../Stream":6,"../disposable/dispose":36,"../scheduler/PropagateTask":44,"./MulticastSource":55}],66:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
exports.tryEvent = tryEvent;
exports.tryEnd = tryEnd;
function tryEvent(t, x, sink) {
try {
sink.event(t, x);
} catch(e) {
sink.error(t, e);
}
}
function tryEnd(t, x, sink) {
try {
sink.end(t, x);
} catch(e) {
sink.error(t, e);
}
}
},{}],67:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('../Stream');
exports.unfold = unfold;
/**
* Compute a stream by unfolding tuples of future values from a seed value
* Event times may be controlled by returning a Promise from f
* @param {function(seed:*):{value:*, seed:*, done:boolean}|Promise<{value:*, seed:*, done:boolean}>} f unfolding function accepts
* a seed and returns a new tuple with a value, new seed, and boolean done flag.
* If tuple.done is true, the stream will end.
* @param {*} seed seed value
* @returns {Stream} stream containing all value of all tuples produced by the
* unfolding function.
*/
function unfold(f, seed) {
return new Stream(new UnfoldSource(f, seed));
}
function UnfoldSource(f, seed) {
this.f = f;
this.value = seed;
}
UnfoldSource.prototype.run = function(sink, scheduler) {
return new Unfold(this.f, this.value, sink, scheduler);
};
function Unfold(f, x, sink, scheduler) {
this.f = f;
this.sink = sink;
this.scheduler = scheduler;
this.active = true;
var self = this;
function err(e) {
self.sink.error(self.scheduler.now(), e);
}
function start(unfold) {
return stepUnfold(unfold, x);
}
Promise.resolve(this).then(start).catch(err);
}
Unfold.prototype.dispose = function() {
this.active = false;
};
function stepUnfold(unfold, x) {
var f = unfold.f;
return Promise.resolve(f(x)).then(function(tuple) {
return continueUnfold(unfold, tuple);
});
}
function continueUnfold(unfold, tuple) {
if(tuple.done) {
unfold.sink.end(unfold.scheduler.now(), tuple.value);
return tuple.value;
}
unfold.sink.event(unfold.scheduler.now(), tuple.value);
if(!unfold.active) {
return tuple.value;
}
return stepUnfold(unfold, tuple.seed);
}
},{"../Stream":6}],68:[function(require,module,exports){
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
var Stream = require('./lib/Stream');
var base = require('./lib/base');
var core = require('./lib/source/core');
var from = require('./lib/source/from').from;
var periodic = require('./lib/source/periodic').periodic;
/**
* Core stream type
* @type {Stream}
*/
exports.Stream = Stream;
// Add of and empty to constructor for fantasy-land compat
exports.of = Stream.of = core.of;
exports.just = core.of; // easier ES6 import alias
exports.empty = Stream.empty = core.empty;
exports.never = core.never;
exports.from = from;
exports.periodic = periodic;
//-----------------------------------------------------------------------
// Creating
var create = require('./lib/source/create');
/**
* Create a stream by imperatively pushing events.
* @param {function(add:function(x), end:function(e)):function} run function
* that will receive 2 functions as arguments, the first to add new values to the
* stream and the second to end the stream. It may *return* a function that
* will be called once all consumers have stopped observing the stream.
* @returns {Stream} stream containing all events added by run before end
*/
exports.create = create.create;
//-----------------------------------------------------------------------
// Adapting other sources
var events = require('./lib/source/fromEvent');
/**
* Create a stream of events from the supplied EventTarget or EventEmitter
* @param {String} event event name
* @param {EventTarget|EventEmitter} source EventTarget or EventEmitter. The source
* must support either addEventListener/removeEventListener (w3c EventTarget:
* http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget),
* or addListener/removeListener (node EventEmitter: http://nodejs.org/api/events.html)
* @returns {Stream} stream of events of the specified type from the source
*/
exports.fromEvent = events.fromEvent;
//-----------------------------------------------------------------------
// Observing
var observe = require('./lib/combinator/observe');
exports.observe = observe.observe;
exports.forEach = observe.observe;
exports.drain = observe.drain;
/**
* Process all the events in the stream
* @returns {Promise} promise that fulfills when the stream ends, or rejects
* if the stream fails with an unhandled error.
*/
Stream.prototype.observe = Stream.prototype.forEach = function(f) {
return observe.observe(f, this);
};
/**
* Consume all events in the stream, without providing a function to process each.
* This causes a stream to become active and begin emitting events, and is useful
* in cases where all processing has been setup upstream via other combinators, and
* there is no need to process the terminal events.
* @returns {Promise} promise that fulfills when the stream ends, or rejects
* if the stream fails with an unhandled error.
*/
Stream.prototype.drain = function() {
return observe.drain(this);
};
//-------------------------------------------------------
var loop = require('./lib/combinator/loop').loop;
exports.loop = loop;
/**
* Generalized feedback loop. Call a stepper function for each event. The stepper
* will be called with 2 params: the current seed and the an event value. It must
* return a new { seed, value } pair. The `seed` will be fed back into the next
* invocation of stepper, and the `value` will be propagated as the event value.
* @param {function(seed:*, value:*):{seed:*, value:*}} stepper loop step function
* @param {*} seed initial seed value passed to first stepper call
* @returns {Stream} new stream whose values are the `value` field of the objects
* returned by the stepper
*/
Stream.prototype.loop = function(stepper, seed) {
return loop(stepper, seed, this);
};
//-------------------------------------------------------
var accumulate = require('./lib/combinator/accumulate');
exports.scan = accumulate.scan;
exports.reduce = accumulate.reduce;
/**
* Create a stream containing successive reduce results of applying f to
* the previous reduce result and the current stream item.
* @param {function(result:*, x:*):*} f reducer function
* @param {*} initial initial value
* @returns {Stream} new stream containing successive reduce results
*/
Stream.prototype.scan = function(f, initial) {
return accumulate.scan(f, initial, this);
};
/**
* Reduce the stream to produce a single result. Note that reducing an infinite
* stream will return a Promise that never fulfills, but that may reject if an error
* occurs.
* @param {function(result:*, x:*):*} f reducer function
* @param {*} initial optional initial value
* @returns {Promise} promise for the file result of the reduce
*/
Stream.prototype.reduce = function(f, initial) {
return accumulate.reduce(f, initial, this);
};
//-----------------------------------------------------------------------
// Building and extending
var unfold = require('./lib/source/unfold');
var iterate = require('./lib/source/iterate');
var generate = require('./lib/source/generate');
var build = require('./lib/combinator/build');
exports.unfold = unfold.unfold;
exports.iterate = iterate.iterate;
exports.generate = generate.generate;
exports.cycle = build.cycle;
exports.concat = build.concat;
exports.startWith = build.cons;
/**
* Tie this stream into a circle, thus creating an infinite stream
* @returns {Stream} new infinite stream
*/
Stream.prototype.cycle = function() {
return build.cycle(this);
};
/**
* @param {Stream} tail
* @returns {Stream} new stream containing all items in this followed by
* all items in tail
*/
Stream.prototype.concat = function(tail) {
return build.concat(this, tail);
};
/**
* @param {*} x value to prepend
* @returns {Stream} a new stream with x prepended
*/
Stream.prototype.startWith = function(x) {
return build.cons(x, this);
};
//-----------------------------------------------------------------------
// Transforming
var transform = require('./lib/combinator/transform');
var applicative = require('./lib/combinator/applicative');
exports.map = transform.map;
exports.constant = transform.constant;
exports.tap = transform.tap;
exports.ap = applicative.ap;
/**
* Transform each value in the stream by applying f to each
* @param {function(*):*} f mapping function
* @returns {Stream} stream containing items transformed by f
*/
Stream.prototype.map = function(f) {
return transform.map(f, this);
};
/**
* Assume this stream contains functions, and apply each function to each item
* in the provided stream. This generates, in effect, a cross product.
* @param {Stream} xs stream of items to which
* @returns {Stream} stream containing the cross product of items
*/
Stream.prototype.ap = function(xs) {
return applicative.ap(this, xs);
};
/**
* Replace each value in the stream with x
* @param {*} x
* @returns {Stream} stream containing items replaced with x
*/
Stream.prototype.constant = function(x) {
return transform.constant(x, this);
};
/**
* Perform a side effect for each item in the stream
* @param {function(x:*):*} f side effect to execute for each item. The
* return value will be discarded.
* @returns {Stream} new stream containing the same items as this stream
*/
Stream.prototype.tap = function(f) {
return transform.tap(f, this);
};
//-----------------------------------------------------------------------
// Transducer support
var transduce = require('./lib/combinator/transduce');
exports.transduce = transduce.transduce;
/**
* Transform this stream by passing its events through a transducer.
* @param {function} transducer transducer function
* @return {Stream} stream of events transformed by the transducer
*/
Stream.prototype.transduce = function(transducer) {
return transduce.transduce(transducer, this);
};
//-----------------------------------------------------------------------
// FlatMapping
var flatMap = require('./lib/combinator/flatMap');
exports.flatMap = exports.chain = flatMap.flatMap;
exports.join = flatMap.join;
/**
* Map each value in the stream to a new stream, and merge it into the
* returned outer stream. Event arrival times are preserved.
* @param {function(x:*):Stream} f chaining function, must return a Stream
* @returns {Stream} new stream containing all events from each stream returned by f
*/
Stream.prototype.flatMap = Stream.prototype.chain = function(f) {
return flatMap.flatMap(f, this);
};
/**
* Monadic join. Flatten a Stream<Stream<X>> to Stream<X> by merging inner
* streams to the outer. Event arrival times are preserved.
* @returns {Stream<X>} new stream containing all events of all inner streams
*/
Stream.prototype.join = function() {
return flatMap.join(this);
};
var continueWith = require('./lib/combinator/continueWith').continueWith;
exports.continueWith = continueWith;
exports.flatMapEnd = continueWith;
/**
* Map the end event to a new stream, and begin emitting its values.
* @param {function(x:*):Stream} f function that receives the end event value,
* and *must* return a new Stream to continue with.
* @returns {Stream} new stream that emits all events from the original stream,
* followed by all events from the stream returned by f.
*/
Stream.prototype.continueWith = Stream.prototype.flatMapEnd = function(f) {
return continueWith(f, this);
};
var concatMap = require('./lib/combinator/concatMap').concatMap;
exports.concatMap = concatMap;
Stream.prototype.concatMap = function(f) {
return concatMap(f, this);
};
//-----------------------------------------------------------------------
// Concurrent merging
var mergeConcurrently = require('./lib/combinator/mergeConcurrently');
exports.mergeConcurrently = mergeConcurrently.mergeConcurrently;
/**
* Flatten a Stream<Stream<X>> to Stream<X> by merging inner
* streams to the outer, limiting the number of inner streams that may
* be active concurrently.
* @param {number} concurrency at most this many inner streams will be
* allowed to be active concurrently.
* @return {Stream<X>} new stream containing all events of all inner
* streams, with limited concurrency.
*/
Stream.prototype.mergeConcurrently = function(concurrency) {
return mergeConcurrently.mergeConcurrently(concurrency, this);
};
//-----------------------------------------------------------------------
// Merging
var merge = require('./lib/combinator/merge');
exports.merge = merge.merge;
exports.mergeArray = merge.mergeArray;
/**
* Merge this stream and all the provided streams
* @returns {Stream} stream containing items from this stream and s in time
* order. If two events are simultaneous they will be merged in
* arbitrary order.
*/
Stream.prototype.merge = function(/*...streams*/) {
return merge.mergeArray(base.cons(this, arguments));
};
//-----------------------------------------------------------------------
// Combining
var combine = require('./lib/combinator/combine');
exports.combine = combine.combine;
exports.combineArray = combine.combineArray;
/**
* Combine latest events from all input streams
* @param {function(...events):*} f function to combine most recent events
* @returns {Stream} stream containing the result of applying f to the most recent
* event of each input stream, whenever a new event arrives on any stream.
*/
Stream.prototype.combine = function(f /*, ...streams*/) {
return combine.combineArray(f, base.replace(this, 0, arguments));
};
//-----------------------------------------------------------------------
// Sampling
var sample = require('./lib/combinator/sample');
exports.sample = sample.sample;
exports.sampleWith = sample.sampleWith;
/**
* When an event arrives on sampler, emit the latest event value from stream.
* @param {Stream} sampler stream of events at whose arrival time
* signal's latest value will be propagated
* @returns {Stream} sampled stream of values
*/
Stream.prototype.sampleWith = function(sampler) {
return sample.sampleWith(sampler, this);
};
/**
* When an event arrives on this stream, emit the result of calling f with the latest
* values of all streams being sampled
* @param {function(...values):*} f function to apply to each set of sampled values
* @returns {Stream} stream of sampled and transformed values
*/
Stream.prototype.sample = function(f /* ...streams */) {
return sample.sampleArray(f, this, base.tail(arguments));
};
//-----------------------------------------------------------------------
// Zipping
var zip = require('./lib/combinator/zip');
exports.zip = zip.zip;
/**
* Pair-wise combine items with those in s. Given 2 streams:
* [1,2,3] zipWith f [4,5,6] -> [f(1,4),f(2,5),f(3,6)]
* Note: zip causes fast streams to buffer and wait for slow streams.
* @param {function(a:Stream, b:Stream, ...):*} f function to combine items
* @returns {Stream} new stream containing pairs
*/
Stream.prototype.zip = function(f /*, ...streams*/) {
return zip.zipArray(f, base.replace(this, 0, arguments));
};
//-----------------------------------------------------------------------
// Switching
var switchLatest = require('./lib/combinator/switch').switch;
exports.switch = switchLatest;
exports.switchLatest = switchLatest;
/**
* Given a stream of streams, return a new stream that adopts the behavior
* of the most recent inner stream.
* @returns {Stream} switching stream
*/
Stream.prototype.switch = Stream.prototype.switchLatest = function() {
return switchLatest(this);
};
//-----------------------------------------------------------------------
// Filtering
var filter = require('./lib/combinator/filter');
exports.filter = filter.filter;
exports.skipRepeats = exports.distinct = filter.skipRepeats;
exports.skipRepeatsWith = exports.distinctBy = filter.skipRepeatsWith;
/**
* Retain only items matching a predicate
* stream: -12345678-
* filter(x => x % 2 === 0, stream): --2-4-6-8-
* @param {function(x:*):boolean} p filtering predicate called for each item
* @returns {Stream} stream containing only items for which predicate returns truthy
*/
Stream.prototype.filter = function(p) {
return filter.filter(p, this);
};
/**
* Skip repeated events, using === to compare items
* stream: -abbcd-
* distinct(stream): -ab-cd-
* @returns {Stream} stream with no repeated events
*/
Stream.prototype.skipRepeats = function() {
return filter.skipRepeats(this);
};
/**
* Skip repeated events, using supplied equals function to compare items
* @param {function(a:*, b:*):boolean} equals function to compare items
* @returns {Stream} stream with no repeated events
*/
Stream.prototype.skipRepeatsWith = function(equals) {
return filter.skipRepeatsWith(equals, this);
};
//-----------------------------------------------------------------------
// Slicing
var slice = require('./lib/combinator/slice');
exports.take = slice.take;
exports.skip = slice.skip;
exports.slice = slice.slice;
exports.takeWhile = slice.takeWhile;
exports.skipWhile = slice.skipWhile;
/**
* stream: -abcd-
* take(2, stream): -ab|
* @param {Number} n take up to this many events
* @returns {Stream} stream containing at most the first n items from this stream
*/
Stream.prototype.take = function(n) {
return slice.take(n, this);
};
/**
* stream: -abcd->
* skip(2, stream): ---cd->
* @param {Number} n skip this many events
* @returns {Stream} stream not containing the first n events
*/
Stream.prototype.skip = function(n) {
return slice.skip(n, this);
};
/**
* Slice a stream by event index. Equivalent to, but more efficient than
* stream.take(end).skip(start);
* NOTE: Negative start and end are not supported
* @param {Number} start skip all events before the start index
* @param {Number} end allow all events from the start index to the end index
* @returns {Stream} stream containing items where start <= index < end
*/
Stream.prototype.slice = function(start, end) {
return slice.slice(start, end, this);
};
/**
* stream: -123451234->
* takeWhile(x => x < 5, stream): -1234|
* @param {function(x:*):boolean} p predicate
* @returns {Stream} stream containing items up to, but not including, the
* first item for which p returns falsy.
*/
Stream.prototype.takeWhile = function(p) {
return slice.takeWhile(p, this);
};
/**
* stream: -123451234->
* skipWhile(x => x < 5, stream): -----51234->
* @param {function(x:*):boolean} p predicate
* @returns {Stream} stream containing items following *and including* the
* first item for which p returns falsy.
*/
Stream.prototype.skipWhile = function(p) {
return slice.skipWhile(p, this);
};
//-----------------------------------------------------------------------
// Time slicing
var timeslice = require('./lib/combinator/timeslice');
exports.until = exports.takeUntil = timeslice.takeUntil;
exports.since = exports.skipUntil = timeslice.skipUntil;
exports.during = timeslice.during;
/**
* stream: -a-b-c-d-e-f-g->
* signal: -------x
* takeUntil(signal, stream): -a-b-c-|
* @param {Stream} signal retain only events in stream before the first
* event in signal
* @returns {Stream} new stream containing only events that occur before
* the first event in signal.
*/
Stream.prototype.until = Stream.prototype.takeUntil = function(signal) {
return timeslice.takeUntil(signal, this);
};
/**
* stream: -a-b-c-d-e-f-g->
* signal: -------x
* takeUntil(signal, stream): -------d-e-f-g->
* @param {Stream} signal retain only events in stream at or after the first
* event in signal
* @returns {Stream} new stream containing only events that occur after
* the first event in signal.
*/
Stream.prototype.since = Stream.prototype.skipUntil = function(signal) {
return timeslice.skipUntil(signal, this);
};
/**
* stream: -a-b-c-d-e-f-g->
* timeWindow: -----s
* s: -----t
* stream.during(timeWindow): -----c-d-e-|
* @param {Stream<Stream>} timeWindow a stream whose first event (s) represents
* the window start time. That event (s) is itself a stream whose first event (t)
* represents the window end time
* @returns {Stream} new stream containing only events within the provided timespan
*/
Stream.prototype.during = function(timeWindow) {
return timeslice.during(timeWindow, this);
};
//-----------------------------------------------------------------------
// Delaying
var delay = require('./lib/combinator/delay').delay;
exports.delay = delay;
/**
* @param {Number} delayTime milliseconds to delay each item
* @returns {Stream} new stream containing the same items, but delayed by ms
*/
Stream.prototype.delay = function(delayTime) {
return delay(delayTime, this);
};
//-----------------------------------------------------------------------
// Getting event timestamp
var timestamp = require('./lib/combinator/timestamp').timestamp;
exports.timestamp = timestamp;
/**
* Expose event timestamps into the stream. Turns a Stream<X> into
* Stream<{time:t, value:X}>
* @returns {Stream<{time:number, value:*}>}
*/
Stream.prototype.timestamp = function() {
return timestamp(this);
};
//-----------------------------------------------------------------------
// Rate limiting
var limit = require('./lib/combinator/limit');
exports.throttle = limit.throttle;
exports.debounce = limit.debounce;
/**
* Limit the rate of events
* stream: abcd----abcd----
* throttle(2, stream): a-c-----a-c-----
* @param {Number} period time to suppress events
* @returns {Stream} new stream that skips events for throttle period
*/
Stream.prototype.throttle = function(period) {
return limit.throttle(period, this);
};
/**
* Wait for a burst of events to subside and emit only the last event in the burst
* stream: abcd----abcd----
* debounce(2, stream): -----d-------d--
* @param {Number} period events occuring more frequently than this
* on the provided scheduler will be suppressed
* @returns {Stream} new debounced stream
*/
Stream.prototype.debounce = function(period) {
return limit.debounce(period, this);
};
//-----------------------------------------------------------------------
// Awaiting Promises
var promises = require('./lib/combinator/promises');
exports.fromPromise = promises.fromPromise;
exports.await = promises.awaitPromises;
/**
* Await promises, turning a Stream<Promise<X>> into Stream<X>. Preserves
* event order, but timeshifts events based on promise resolution time.
* @returns {Stream<X>} stream containing non-promise values
*/
Stream.prototype.await = function() {
return promises.awaitPromises(this);
};
//-----------------------------------------------------------------------
// Error handling
var errors = require('./lib/combinator/errors');
exports.recoverWith = errors.flatMapError;
exports.flatMapError = errors.flatMapError;
exports.throwError = errors.throwError;
/**
* If this stream encounters an error, recover and continue with items from stream
* returned by f.
* stream: -a-b-c-X-
* f(X): d-e-f-g-
* flatMapError(f, stream): -a-b-c-d-e-f-g-
* @param {function(error:*):Stream} f function which returns a new stream
* @returns {Stream} new stream which will recover from an error by calling f
*/
Stream.prototype.recoverWith = Stream.prototype.flatMapError = function(f) {
return errors.flatMapError(f, this);
};
//-----------------------------------------------------------------------
// Multicasting
var multicast = require('./lib/combinator/multicast').multicast;
exports.multicast = multicast;
/**
* Transform the stream into multicast stream. That means that many subscribers
* to the stream will not cause multiple invocations of the internal machinery.
* @returns {Stream} new stream which will multicast events to all observers.
*/
Stream.prototype.multicast = function() {
return multicast(this);
};
},{"./lib/Stream":6,"./lib/base":7,"./lib/combinator/accumulate":8,"./lib/combinator/applicative":9,"./lib/combinator/build":10,"./lib/combinator/combine":11,"./lib/combinator/concatMap":12,"./lib/combinator/continueWith":13,"./lib/combinator/delay":14,"./lib/combinator/errors":15,"./lib/combinator/filter":16,"./lib/combinator/flatMap":17,"./lib/combinator/limit":18,"./lib/combinator/loop":19,"./lib/combinator/merge":20,"./lib/combinator/mergeConcurrently":21,"./lib/combinator/multicast":22,"./lib/combinator/observe":23,"./lib/combinator/promises":24,"./lib/combinator/sample":25,"./lib/combinator/slice":26,"./lib/combinator/switch":27,"./lib/combinator/timeslice":28,"./lib/combinator/timestamp":29,"./lib/combinator/transduce":30,"./lib/combinator/transform":31,"./lib/combinator/zip":32,"./lib/source/core":57,"./lib/source/create":58,"./lib/source/from":59,"./lib/source/fromEvent":61,"./lib/source/generate":63,"./lib/source/iterate":64,"./lib/source/periodic":65,"./lib/source/unfold":67}],69:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;
function cleanUpNextTick() {
draining = false;
if (currentQueue.length) {
queue = currentQueue.concat(queue);
} else {
queueIndex = -1;
}
if (queue.length) {
drainQueue();
}
}
function drainQueue() {
if (draining) {
return;
}
var timeout = setTimeout(cleanUpNextTick);
draining = true;
var len = queue.length;
while(len) {
currentQueue = queue;
queue = [];
while (++queueIndex < len) {
if (currentQueue) {
currentQueue[queueIndex].run();
}
}
queueIndex = -1;
len = queue.length;
}
currentQueue = null;
draining = false;
clearTimeout(timeout);
}
process.nextTick = function (fun) {
var args = new Array(arguments.length - 1);
if (arguments.length > 1) {
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
}
queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) {
setTimeout(drainQueue, 0);
}
};
// v8 likes predictible objects
function Item(fun, array) {
this.fun = fun;
this.array = array;
}
Item.prototype.run = function () {
this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };
},{}],70:[function(require,module,exports){
/**
* Reduce `arr` with `fn`.
*
* @param {Array} arr
* @param {Function} fn
* @param {Mixed} initial
*
* TODO: combatible error handling?
*/
module.exports = function(arr, fn, initial){
var idx = 0;
var len = arr.length;
var curr = arguments.length == 3
? initial
: arr[idx++];
while (idx < len) {
curr = fn.call(null, curr, arr[idx], ++idx, arr);
}
return curr;
};
},{}],71:[function(require,module,exports){
/**
* Module dependencies.
*/
var Emitter = require('emitter');
var reduce = require('reduce');
/**
* Root reference for iframes.
*/
var root;
if (typeof window !== 'undefined') { // Browser window
root = window;
} else if (typeof self !== 'undefined') { // Web Worker
root = self;
} else { // Other environments
root = this;
}
/**
* Noop.
*/
function noop(){};
/**
* Check if `obj` is a host object,
* we don't want to serialize these :)
*
* TODO: future proof, move to compoent land
*
* @param {Object} obj
* @return {Boolean}
* @api private
*/
function isHost(obj) {
var str = {}.toString.call(obj);
switch (str) {
case '[object File]':
case '[object Blob]':
case '[object FormData]':
return true;
default:
return false;
}
}
/**
* Determine XHR.
*/
request.getXHR = function () {
if (root.XMLHttpRequest
&& (!root.location || 'file:' != root.location.protocol
|| !root.ActiveXObject)) {
return new XMLHttpRequest;
} else {
try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}
try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}
try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}
try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}
}
return false;
};
/**
* Removes leading and trailing whitespace, added to support IE.
*
* @param {String} s
* @return {String}
* @api private
*/
var trim = ''.trim
? function(s) { return s.trim(); }
: function(s) { return s.replace(/(^\s*|\s*$)/g, ''); };
/**
* Check if `obj` is an object.
*
* @param {Object} obj
* @return {Boolean}
* @api private
*/
function isObject(obj) {
return obj === Object(obj);
}
/**
* Serialize the given `obj`.
*
* @param {Object} obj
* @return {String}
* @api private
*/
function serialize(obj) {
if (!isObject(obj)) return obj;
var pairs = [];
for (var key in obj) {
if (null != obj[key]) {
pushEncodedKeyValuePair(pairs, key, obj[key]);
}
}
return pairs.join('&');
}
/**
* Helps 'serialize' with serializing arrays.
* Mutates the pairs array.
*
* @param {Array} pairs
* @param {String} key
* @param {Mixed} val
*/
function pushEncodedKeyValuePair(pairs, key, val) {
if (Array.isArray(val)) {
return val.forEach(function(v) {
pushEncodedKeyValuePair(pairs, key, v);
});
}
pairs.push(encodeURIComponent(key)
+ '=' + encodeURIComponent(val));
}
/**
* Expose serialization method.
*/
request.serializeObject = serialize;
/**
* Parse the given x-www-form-urlencoded `str`.
*
* @param {String} str
* @return {Object}
* @api private
*/
function parseString(str) {
var obj = {};
var pairs = str.split('&');
var parts;
var pair;
for (var i = 0, len = pairs.length; i < len; ++i) {
pair = pairs[i];
parts = pair.split('=');
obj[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
}
return obj;
}
/**
* Expose parser.
*/
request.parseString = parseString;
/**
* Default MIME type map.
*
* superagent.types.xml = 'application/xml';
*
*/
request.types = {
html: 'text/html',
json: 'application/json',
xml: 'application/xml',
urlencoded: 'application/x-www-form-urlencoded',
'form': 'application/x-www-form-urlencoded',
'form-data': 'application/x-www-form-urlencoded'
};
/**
* Default serialization map.
*
* superagent.serialize['application/xml'] = function(obj){
* return 'generated xml here';
* };
*
*/
request.serialize = {
'application/x-www-form-urlencoded': serialize,
'application/json': JSON.stringify
};
/**
* Default parsers.
*
* superagent.parse['application/xml'] = function(str){
* return { object parsed from str };
* };
*
*/
request.parse = {
'application/x-www-form-urlencoded': parseString,
'application/json': JSON.parse
};
/**
* Parse the given header `str` into
* an object containing the mapped fields.
*
* @param {String} str
* @return {Object}
* @api private
*/
function parseHeader(str) {
var lines = str.split(/\r?\n/);
var fields = {};
var index;
var line;
var field;
var val;
lines.pop(); // trailing CRLF
for (var i = 0, len = lines.length; i < len; ++i) {
line = lines[i];
index = line.indexOf(':');
field = line.slice(0, index).toLowerCase();
val = trim(line.slice(index + 1));
fields[field] = val;
}
return fields;
}
/**
* Check if `mime` is json or has +json structured syntax suffix.
*
* @param {String} mime
* @return {Boolean}
* @api private
*/
function isJSON(mime) {
return /[\/+]json\b/.test(mime);
}
/**
* Return the mime type for the given `str`.
*
* @param {String} str
* @return {String}
* @api private
*/
function type(str){
return str.split(/ *; */).shift();
};
/**
* Return header field parameters.
*
* @param {String} str
* @return {Object}
* @api private
*/
function params(str){
return reduce(str.split(/ *; */), function(obj, str){
var parts = str.split(/ *= */)
, key = parts.shift()
, val = parts.shift();
if (key && val) obj[key] = val;
return obj;
}, {});
};
/**
* Initialize a new `Response` with the given `xhr`.
*
* - set flags (.ok, .error, etc)
* - parse header
*
* Examples:
*
* Aliasing `superagent` as `request` is nice:
*
* request = superagent;
*
* We can use the promise-like API, or pass callbacks:
*
* request.get('/').end(function(res){});
* request.get('/', function(res){});
*
* Sending data can be chained:
*
* request
* .post('/user')
* .send({ name: 'tj' })
* .end(function(res){});
*
* Or passed to `.send()`:
*
* request
* .post('/user')
* .send({ name: 'tj' }, function(res){});
*
* Or passed to `.post()`:
*
* request
* .post('/user', { name: 'tj' })
* .end(function(res){});
*
* Or further reduced to a single call for simple cases:
*
* request
* .post('/user', { name: 'tj' }, function(res){});
*
* @param {XMLHTTPRequest} xhr
* @param {Object} options
* @api private
*/
function Response(req, options) {
options = options || {};
this.req = req;
this.xhr = this.req.xhr;
// responseText is accessible only if responseType is '' or 'text' and on older browsers
this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined')
? this.xhr.responseText
: null;
this.statusText = this.req.xhr.statusText;
this.setStatusProperties(this.xhr.status);
this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders());
// getAllResponseHeaders sometimes falsely returns "" for CORS requests, but
// getResponseHeader still works. so we get content-type even if getting
// other headers fails.
this.header['content-type'] = this.xhr.getResponseHeader('content-type');
this.setHeaderProperties(this.header);
this.body = this.req.method != 'HEAD'
? this.parseBody(this.text ? this.text : this.xhr.response)
: null;
}
/**
* Get case-insensitive `field` value.
*
* @param {String} field
* @return {String}
* @api public
*/
Response.prototype.get = function(field){
return this.header[field.toLowerCase()];
};
/**
* Set header related properties:
*
* - `.type` the content type without params
*
* A response of "Content-Type: text/plain; charset=utf-8"
* will provide you with a `.type` of "text/plain".
*
* @param {Object} header
* @api private
*/
Response.prototype.setHeaderProperties = function(header){
// content-type
var ct = this.header['content-type'] || '';
this.type = type(ct);
// params
var obj = params(ct);
for (var key in obj) this[key] = obj[key];
};
/**
* Parse the given body `str`.
*
* Used for auto-parsing of bodies. Parsers
* are defined on the `superagent.parse` object.
*
* @param {String} str
* @return {Mixed}
* @api private
*/
Response.prototype.parseBody = function(str){
var parse = request.parse[this.type];
return parse && str && (str.length || str instanceof Object)
? parse(str)
: null;
};
/**
* Set flags such as `.ok` based on `status`.
*
* For example a 2xx response will give you a `.ok` of __true__
* whereas 5xx will be __false__ and `.error` will be __true__. The
* `.clientError` and `.serverError` are also available to be more
* specific, and `.statusType` is the class of error ranging from 1..5
* sometimes useful for mapping respond colors etc.
*
* "sugar" properties are also defined for common cases. Currently providing:
*
* - .noContent
* - .badRequest
* - .unauthorized
* - .notAcceptable
* - .notFound
*
* @param {Number} status
* @api private
*/
Response.prototype.setStatusProperties = function(status){
// handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request
if (status === 1223) {
status = 204;
}
var type = status / 100 | 0;
// status / class
this.status = this.statusCode = status;
this.statusType = type;
// basics
this.info = 1 == type;
this.ok = 2 == type;
this.clientError = 4 == type;
this.serverError = 5 == type;
this.error = (4 == type || 5 == type)
? this.toError()
: false;
// sugar
this.accepted = 202 == status;
this.noContent = 204 == status;
this.badRequest = 400 == status;
this.unauthorized = 401 == status;
this.notAcceptable = 406 == status;
this.notFound = 404 == status;
this.forbidden = 403 == status;
};
/**
* Return an `Error` representative of this response.
*
* @return {Error}
* @api public
*/
Response.prototype.toError = function(){
var req = this.req;
var method = req.method;
var url = req.url;
var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')';
var err = new Error(msg);
err.status = this.status;
err.method = method;
err.url = url;
return err;
};
/**
* Expose `Response`.
*/
request.Response = Response;
/**
* Initialize a new `Request` with the given `method` and `url`.
*
* @param {String} method
* @param {String} url
* @api public
*/
function Request(method, url) {
var self = this;
Emitter.call(this);
this._query = this._query || [];
this.method = method;
this.url = url;
this.header = {};
this._header = {};
this.on('end', function(){
var err = null;
var res = null;
try {
res = new Response(self);
} catch(e) {
err = new Error('Parser is unable to parse the response');
err.parse = true;
err.original = e;
// issue #675: return the raw response if the response parsing fails
err.rawResponse = self.xhr && self.xhr.responseText ? self.xhr.responseText : null;
return self.callback(err);
}
self.emit('response', res);
if (err) {
return self.callback(err, res);
}
if (res.status >= 200 && res.status < 300) {
return self.callback(err, res);
}
var new_err = new Error(res.statusText || 'Unsuccessful HTTP response');
new_err.original = err;
new_err.response = res;
new_err.status = res.status;
self.callback(new_err, res);
});
}
/**
* Mixin `Emitter`.
*/
Emitter(Request.prototype);
/**
* Allow for extension
*/
Request.prototype.use = function(fn) {
fn(this);
return this;
}
/**
* Set timeout to `ms`.
*
* @param {Number} ms
* @return {Request} for chaining
* @api public
*/
Request.prototype.timeout = function(ms){
this._timeout = ms;
return this;
};
/**
* Clear previous timeout.
*
* @return {Request} for chaining
* @api public
*/
Request.prototype.clearTimeout = function(){
this._timeout = 0;
clearTimeout(this._timer);
return this;
};
/**
* Abort the request, and clear potential timeout.
*
* @return {Request}
* @api public
*/
Request.prototype.abort = function(){
if (this.aborted) return;
this.aborted = true;
this.xhr.abort();
this.clearTimeout();
this.emit('abort');
return this;
};
/**
* Set header `field` to `val`, or multiple fields with one object.
*
* Examples:
*
* req.get('/')
* .set('Accept', 'application/json')
* .set('X-API-Key', 'foobar')
* .end(callback);
*
* req.get('/')
* .set({ Accept: 'application/json', 'X-API-Key': 'foobar' })
* .end(callback);
*
* @param {String|Object} field
* @param {String} val
* @return {Request} for chaining
* @api public
*/
Request.prototype.set = function(field, val){
if (isObject(field)) {
for (var key in field) {
this.set(key, field[key]);
}
return this;
}
this._header[field.toLowerCase()] = val;
this.header[field] = val;
return this;
};
/**
* Remove header `field`.
*
* Example:
*
* req.get('/')
* .unset('User-Agent')
* .end(callback);
*
* @param {String} field
* @return {Request} for chaining
* @api public
*/
Request.prototype.unset = function(field){
delete this._header[field.toLowerCase()];
delete this.header[field];
return this;
};
/**
* Get case-insensitive header `field` value.
*
* @param {String} field
* @return {String}
* @api private
*/
Request.prototype.getHeader = function(field){
return this._header[field.toLowerCase()];
};
/**
* Set Content-Type to `type`, mapping values from `request.types`.
*
* Examples:
*
* superagent.types.xml = 'application/xml';
*
* request.post('/')
* .type('xml')
* .send(xmlstring)
* .end(callback);
*
* request.post('/')
* .type('application/xml')
* .send(xmlstring)
* .end(callback);
*
* @param {String} type
* @return {Request} for chaining
* @api public
*/
Request.prototype.type = function(type){
this.set('Content-Type', request.types[type] || type);
return this;
};
/**
* Force given parser
*
* Sets the body parser no matter type.
*
* @param {Function}
* @api public
*/
Request.prototype.parse = function(fn){
this._parser = fn;
return this;
};
/**
* Set Accept to `type`, mapping values from `request.types`.
*
* Examples:
*
* superagent.types.json = 'application/json';
*
* request.get('/agent')
* .accept('json')
* .end(callback);
*
* request.get('/agent')
* .accept('application/json')
* .end(callback);
*
* @param {String} accept
* @return {Request} for chaining
* @api public
*/
Request.prototype.accept = function(type){
this.set('Accept', request.types[type] || type);
return this;
};
/**
* Set Authorization field value with `user` and `pass`.
*
* @param {String} user
* @param {String} pass
* @return {Request} for chaining
* @api public
*/
Request.prototype.auth = function(user, pass){
var str = btoa(user + ':' + pass);
this.set('Authorization', 'Basic ' + str);
return this;
};
/**
* Add query-string `val`.
*
* Examples:
*
* request.get('/shoes')
* .query('size=10')
* .query({ color: 'blue' })
*
* @param {Object|String} val
* @return {Request} for chaining
* @api public
*/
Request.prototype.query = function(val){
if ('string' != typeof val) val = serialize(val);
if (val) this._query.push(val);
return this;
};
/**
* Write the field `name` and `val` for "multipart/form-data"
* request bodies.
*
* ``` js
* request.post('/upload')
* .field('foo', 'bar')
* .end(callback);
* ```
*
* @param {String} name
* @param {String|Blob|File} val
* @return {Request} for chaining
* @api public
*/
Request.prototype.field = function(name, val){
if (!this._formData) this._formData = new root.FormData();
this._formData.append(name, val);
return this;
};
/**
* Queue the given `file` as an attachment to the specified `field`,
* with optional `filename`.
*
* ``` js
* request.post('/upload')
* .attach(new Blob(['<a id="a"><b id="b">hey!</b></a>'], { type: "text/html"}))
* .end(callback);
* ```
*
* @param {String} field
* @param {Blob|File} file
* @param {String} filename
* @return {Request} for chaining
* @api public
*/
Request.prototype.attach = function(field, file, filename){
if (!this._formData) this._formData = new root.FormData();
this._formData.append(field, file, filename || file.name);
return this;
};
/**
* Send `data` as the request body, defaulting the `.type()` to "json" when
* an object is given.
*
* Examples:
*
* // manual json
* request.post('/user')
* .type('json')
* .send('{"name":"tj"}')
* .end(callback)
*
* // auto json
* request.post('/user')
* .send({ name: 'tj' })
* .end(callback)
*
* // manual x-www-form-urlencoded
* request.post('/user')
* .type('form')
* .send('name=tj')
* .end(callback)
*
* // auto x-www-form-urlencoded
* request.post('/user')
* .type('form')
* .send({ name: 'tj' })
* .end(callback)
*
* // defaults to x-www-form-urlencoded
* request.post('/user')
* .send('name=tobi')
* .send('species=ferret')
* .end(callback)
*
* @param {String|Object} data
* @return {Request} for chaining
* @api public
*/
Request.prototype.send = function(data){
var obj = isObject(data);
var type = this.getHeader('Content-Type');
// merge
if (obj && isObject(this._data)) {
for (var key in data) {
this._data[key] = data[key];
}
} else if ('string' == typeof data) {
if (!type) this.type('form');
type = this.getHeader('Content-Type');
if ('application/x-www-form-urlencoded' == type) {
this._data = this._data
? this._data + '&' + data
: data;
} else {
this._data = (this._data || '') + data;
}
} else {
this._data = data;
}
if (!obj || isHost(data)) return this;
if (!type) this.type('json');
return this;
};
/**
* Invoke the callback with `err` and `res`
* and handle arity check.
*
* @param {Error} err
* @param {Response} res
* @api private
*/
Request.prototype.callback = function(err, res){
var fn = this._callback;
this.clearTimeout();
fn(err, res);
};
/**
* Invoke callback with x-domain error.
*
* @api private
*/
Request.prototype.crossDomainError = function(){
var err = new Error('Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.');
err.crossDomain = true;
err.status = this.status;
err.method = this.method;
err.url = this.url;
this.callback(err);
};
/**
* Invoke callback with timeout error.
*
* @api private
*/
Request.prototype.timeoutError = function(){
var timeout = this._timeout;
var err = new Error('timeout of ' + timeout + 'ms exceeded');
err.timeout = timeout;
this.callback(err);
};
/**
* Enable transmission of cookies with x-domain requests.
*
* Note that for this to work the origin must not be
* using "Access-Control-Allow-Origin" with a wildcard,
* and also must set "Access-Control-Allow-Credentials"
* to "true".
*
* @api public
*/
Request.prototype.withCredentials = function(){
this._withCredentials = true;
return this;
};
/**
* Initiate request, invoking callback `fn(res)`
* with an instanceof `Response`.
*
* @param {Function} fn
* @return {Request} for chaining
* @api public
*/
Request.prototype.end = function(fn){
var self = this;
var xhr = this.xhr = request.getXHR();
var query = this._query.join('&');
var timeout = this._timeout;
var data = this._formData || this._data;
// store callback
this._callback = fn || noop;
// state change
xhr.onreadystatechange = function(){
if (4 != xhr.readyState) return;
// In IE9, reads to any property (e.g. status) off of an aborted XHR will
// result in the error "Could not complete the operation due to error c00c023f"
var status;
try { status = xhr.status } catch(e) { status = 0; }
if (0 == status) {
if (self.timedout) return self.timeoutError();
if (self.aborted) return;
return self.crossDomainError();
}
self.emit('end');
};
// progress
var handleProgress = function(e){
if (e.total > 0) {
e.percent = e.loaded / e.total * 100;
}
e.direction = 'download';
self.emit('progress', e);
};
if (this.hasListeners('progress')) {
xhr.onprogress = handleProgress;
}
try {
if (xhr.upload && this.hasListeners('progress')) {
xhr.upload.onprogress = handleProgress;
}
} catch(e) {
// Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.
// Reported here:
// https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context
}
// timeout
if (timeout && !this._timer) {
this._timer = setTimeout(function(){
self.timedout = true;
self.abort();
}, timeout);
}
// querystring
if (query) {
query = request.serializeObject(query);
this.url += ~this.url.indexOf('?')
? '&' + query
: '?' + query;
}
// initiate request
xhr.open(this.method, this.url, true);
// CORS
if (this._withCredentials) xhr.withCredentials = true;
// body
if ('GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !isHost(data)) {
// serialize stuff
var contentType = this.getHeader('Content-Type');
var serialize = this._parser || request.serialize[contentType ? contentType.split(';')[0] : ''];
if (!serialize && isJSON(contentType)) serialize = request.serialize['application/json'];
if (serialize) data = serialize(data);
}
// set header fields
for (var field in this.header) {
if (null == this.header[field]) continue;
xhr.setRequestHeader(field, this.header[field]);
}
// send stuff
this.emit('request', this);
// IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing)
// We need null here if data is undefined
xhr.send(typeof data !== 'undefined' ? data : null);
return this;
};
/**
* Faux promise support
*
* @param {Function} fulfill
* @param {Function} reject
* @return {Request}
*/
Request.prototype.then = function (fulfill, reject) {
return this.end(function(err, res) {
err ? reject(err) : fulfill(res);
});
}
/**
* Expose `Request`.
*/
request.Request = Request;
/**
* Issue a request:
*
* Examples:
*
* request('GET', '/users').end(callback)
* request('/users').end(callback)
* request('/users', callback)
*
* @param {String} method
* @param {String|Function} url or callback
* @return {Request}
* @api public
*/
function request(method, url) {
// callback
if ('function' == typeof url) {
return new Request('GET', method).end(url);
}
// url first
if (1 == arguments.length) {
return new Request('GET', method);
}
return new Request(method, url);
}
/**
* GET `url` with optional callback `fn(res)`.
*
* @param {String} url
* @param {Mixed|Function} data or fn
* @param {Function} fn
* @return {Request}
* @api public
*/
request.get = function(url, data, fn){
var req = request('GET', url);
if ('function' == typeof data) fn = data, data = null;
if (data) req.query(data);
if (fn) req.end(fn);
return req;
};
/**
* HEAD `url` with optional callback `fn(res)`.
*
* @param {String} url
* @param {Mixed|Function} data or fn
* @param {Function} fn
* @return {Request}
* @api public
*/
request.head = function(url, data, fn){
var req = request('HEAD', url);
if ('function' == typeof data) fn = data, data = null;
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
/**
* DELETE `url` with optional callback `fn(res)`.
*
* @param {String} url
* @param {Function} fn
* @return {Request}
* @api public
*/
function del(url, fn){
var req = request('DELETE', url);
if (fn) req.end(fn);
return req;
};
request['del'] = del;
request['delete'] = del;
/**
* PATCH `url` with optional `data` and callback `fn(res)`.
*
* @param {String} url
* @param {Mixed} data
* @param {Function} fn
* @return {Request}
* @api public
*/
request.patch = function(url, data, fn){
var req = request('PATCH', url);
if ('function' == typeof data) fn = data, data = null;
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
/**
* POST `url` with optional `data` and callback `fn(res)`.
*
* @param {String} url
* @param {Mixed} data
* @param {Function} fn
* @return {Request}
* @api public
*/
request.post = function(url, data, fn){
var req = request('POST', url);
if ('function' == typeof data) fn = data, data = null;
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
/**
* PUT `url` with optional `data` and callback `fn(res)`.
*
* @param {String} url
* @param {Mixed|Function} data or fn
* @param {Function} fn
* @return {Request}
* @api public
*/
request.put = function(url, data, fn){
var req = request('PUT', url);
if ('function' == typeof data) fn = data, data = null;
if (data) req.send(data);
if (fn) req.end(fn);
return req;
};
/**
* Expose `request`.
*/
module.exports = request;
},{"emitter":2,"reduce":70}],"@motorcycle/http":[function(require,module,exports){
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.makeHTTPDriver = exports.createResponse$ = exports.urlToSuperagent = exports.optionsToSuperagent = undefined;
var _most = require('most');
var _most2 = _interopRequireDefault(_most);
var _hold = require('@most/hold');
var _hold2 = _interopRequireDefault(_hold);
var _superagent = require('superagent');
var _superagent2 = _interopRequireDefault(_superagent);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var notNull = function notNull(arg) {
return arg !== null;
};
var typeOf = function typeOf(type, arg) {
return (typeof arg === 'undefined' ? 'undefined' : _typeof(arg)) === type;
};
var is = {
notNull: notNull,
typeOf: typeOf
};
var optionsToSuperagent = function optionsToSuperagent(_ref) {
var // eslint-disable-line
// ESLint doesn't like function complexity
url = _ref.url;
var _ref$send = _ref.send;
var send = _ref$send === undefined ? null : _ref$send;
var _ref$accept = _ref.accept;
var accept = _ref$accept === undefined ? null : _ref$accept;
var _ref$query = _ref.query;
var query = _ref$query === undefined ? null : _ref$query;
var _ref$user = _ref.user;
var user = _ref$user === undefined ? null : _ref$user;
var _ref$password = _ref.password;
var password = _ref$password === undefined ? null : _ref$password;
var _ref$field = _ref.field;
var field = _ref$field === undefined ? null : _ref$field;
var _ref$attach = _ref.attach;
var attach = _ref$attach === undefined ? null : _ref$attach;
var _ref$withCredentials = _ref.withCredentials;
var // if valid, should be an array
withCredentials = _ref$withCredentials === undefined ? false : _ref$withCredentials;
var _ref$headers = _ref.headers;
var headers = _ref$headers === undefined ? {} : _ref$headers;
var _ref$redirects = _ref.redirects;
var redirects = _ref$redirects === undefined ? 5 : _ref$redirects;
var _ref$type = _ref.type;
var type = _ref$type === undefined ? 'json' : _ref$type;
var _ref$method = _ref.method;
var method = _ref$method === undefined ? 'get' : _ref$method;
if (typeof url !== 'string') {
throw new Error('Please provide a `url` property in the request ' + 'options.');
}
var lowerCaseMethod = method.toLowerCase();
var sanitizedMethod = lowerCaseMethod === 'delete' ? 'del' : lowerCaseMethod;
var request = _superagent2.default[sanitizedMethod](url);
request = is.typeOf('function', request.redirects) ? request.redirects(redirects) : request;
request = request.type(type);
request = is.notNull(send) ? request.send(send) : request;
request = is.notNull(accept) ? request.accept(accept) : request;
request = is.notNull(query) ? request.query(query) : request;
request = withCredentials ? request.withCredentials() : request;
request = is.notNull(user) && is.notNull(password) ? request.auth(user, password) : request;
for (var key in headers) {
if (headers.hasOwnProperty(key)) {
request = request.set(key, headers[key]);
}
}
for (var key in field) {
if (field.hasOwnProperty(key)) {
request = request.field(key, field[key]);
}
}
if (is.notNull(attach)) {
for (var i = attach.length - 1; i >= 0; i--) {
var a = attach[i];
request = request.attach(a.name, a.path, a.filename);
}
}
return request;
};
var urlToSuperagent = function urlToSuperagent(url) {
return _superagent2.default.get(url);
};
var createResponse$ = function createResponse$(reqOptions) {
return _most2.default.create(function (add, end, error) {
var request = is.typeOf('string', reqOptions) ? urlToSuperagent(reqOptions) : request;
request = is.typeOf('object', reqOptions) ? optionsToSuperagent(reqOptions) : request;
if (!request) {
error(new Error('Observable of requests given to HTTP ' + 'Driver must emit either URL strings or objects with parameters.'));
return function () {}; // noop
}
try {
request.end(function (err, res) {
if (err) {
error(err);
} else {
add(res);
end();
}
});
} catch (err) {
error(err);
}
return function onDispose() {
request.abort();
};
});
};
var isolateSource = function isolateSource(response$$, scope) {
return response$$.filter(function (res$) {
return Array.isArray(res$.request._namespace) && res$.request._namespace.indexOf(scope) !== -1;
});
};
var isolateSink = function isolateSink(request$, scope) {
return request$.map(function (req) {
if (typeof req === 'string') {
return { url: req, _namespace: [scope] };
}
req._namespace = req._namespace || [];
req._namespace.push(scope);
return req;
});
};
var makeHTTPDriver = function makeHTTPDriver() {
var _ref2 = arguments.length <= 0 || arguments[0] === undefined ? { eager: false } : arguments[0];
var _ref2$eager = _ref2.eager;
var eager = _ref2$eager === undefined ? false : _ref2$eager;
return function (request$) {
var _response$$ = request$.map(function (reqOptions) {
var response$ = createResponse$(reqOptions);
if (eager || reqOptions.eager) {
response$ = (0, _hold2.default)(response$);
response$.drain();
}
response$.request = reqOptions;
return response$;
});
_response$$.drain();
var response$$ = (0, _hold2.default)(_response$$);
response$$.isolateSink = isolateSink;
response$$.isolateSource = isolateSource;
return response$$;
};
};
exports.optionsToSuperagent = optionsToSuperagent;
exports.urlToSuperagent = urlToSuperagent;
exports.createResponse$ = createResponse$;
exports.makeHTTPDriver = makeHTTPDriver;
},{"@most/hold":1,"most":68,"superagent":71}]},{},[])("@motorcycle/http")
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment