You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					200 lines
				
				5.4 KiB
			
		
		
			
		
	
	
					200 lines
				
				5.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								// https://github.com/zenparsing/es-observable
							 | 
						||
| 
								 | 
							
								var $export = require('./_export');
							 | 
						||
| 
								 | 
							
								var global = require('./_global');
							 | 
						||
| 
								 | 
							
								var core = require('./_core');
							 | 
						||
| 
								 | 
							
								var microtask = require('./_microtask')();
							 | 
						||
| 
								 | 
							
								var OBSERVABLE = require('./_wks')('observable');
							 | 
						||
| 
								 | 
							
								var aFunction = require('./_a-function');
							 | 
						||
| 
								 | 
							
								var anObject = require('./_an-object');
							 | 
						||
| 
								 | 
							
								var anInstance = require('./_an-instance');
							 | 
						||
| 
								 | 
							
								var redefineAll = require('./_redefine-all');
							 | 
						||
| 
								 | 
							
								var hide = require('./_hide');
							 | 
						||
| 
								 | 
							
								var forOf = require('./_for-of');
							 | 
						||
| 
								 | 
							
								var RETURN = forOf.RETURN;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var getMethod = function (fn) {
							 | 
						||
| 
								 | 
							
								  return fn == null ? undefined : aFunction(fn);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var cleanupSubscription = function (subscription) {
							 | 
						||
| 
								 | 
							
								  var cleanup = subscription._c;
							 | 
						||
| 
								 | 
							
								  if (cleanup) {
							 | 
						||
| 
								 | 
							
								    subscription._c = undefined;
							 | 
						||
| 
								 | 
							
								    cleanup();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var subscriptionClosed = function (subscription) {
							 | 
						||
| 
								 | 
							
								  return subscription._o === undefined;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var closeSubscription = function (subscription) {
							 | 
						||
| 
								 | 
							
								  if (!subscriptionClosed(subscription)) {
							 | 
						||
| 
								 | 
							
								    subscription._o = undefined;
							 | 
						||
| 
								 | 
							
								    cleanupSubscription(subscription);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Subscription = function (observer, subscriber) {
							 | 
						||
| 
								 | 
							
								  anObject(observer);
							 | 
						||
| 
								 | 
							
								  this._c = undefined;
							 | 
						||
| 
								 | 
							
								  this._o = observer;
							 | 
						||
| 
								 | 
							
								  observer = new SubscriptionObserver(this);
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    var cleanup = subscriber(observer);
							 | 
						||
| 
								 | 
							
								    var subscription = cleanup;
							 | 
						||
| 
								 | 
							
								    if (cleanup != null) {
							 | 
						||
| 
								 | 
							
								      if (typeof cleanup.unsubscribe === 'function') cleanup = function () { subscription.unsubscribe(); };
							 | 
						||
| 
								 | 
							
								      else aFunction(cleanup);
							 | 
						||
| 
								 | 
							
								      this._c = cleanup;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  } catch (e) {
							 | 
						||
| 
								 | 
							
								    observer.error(e);
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  } if (subscriptionClosed(this)) cleanupSubscription(this);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Subscription.prototype = redefineAll({}, {
							 | 
						||
| 
								 | 
							
								  unsubscribe: function unsubscribe() { closeSubscription(this); }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var SubscriptionObserver = function (subscription) {
							 | 
						||
| 
								 | 
							
								  this._s = subscription;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SubscriptionObserver.prototype = redefineAll({}, {
							 | 
						||
| 
								 | 
							
								  next: function next(value) {
							 | 
						||
| 
								 | 
							
								    var subscription = this._s;
							 | 
						||
| 
								 | 
							
								    if (!subscriptionClosed(subscription)) {
							 | 
						||
| 
								 | 
							
								      var observer = subscription._o;
							 | 
						||
| 
								 | 
							
								      try {
							 | 
						||
| 
								 | 
							
								        var m = getMethod(observer.next);
							 | 
						||
| 
								 | 
							
								        if (m) return m.call(observer, value);
							 | 
						||
| 
								 | 
							
								      } catch (e) {
							 | 
						||
| 
								 | 
							
								        try {
							 | 
						||
| 
								 | 
							
								          closeSubscription(subscription);
							 | 
						||
| 
								 | 
							
								        } finally {
							 | 
						||
| 
								 | 
							
								          throw e;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  error: function error(value) {
							 | 
						||
| 
								 | 
							
								    var subscription = this._s;
							 | 
						||
| 
								 | 
							
								    if (subscriptionClosed(subscription)) throw value;
							 | 
						||
| 
								 | 
							
								    var observer = subscription._o;
							 | 
						||
| 
								 | 
							
								    subscription._o = undefined;
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      var m = getMethod(observer.error);
							 | 
						||
| 
								 | 
							
								      if (!m) throw value;
							 | 
						||
| 
								 | 
							
								      value = m.call(observer, value);
							 | 
						||
| 
								 | 
							
								    } catch (e) {
							 | 
						||
| 
								 | 
							
								      try {
							 | 
						||
| 
								 | 
							
								        cleanupSubscription(subscription);
							 | 
						||
| 
								 | 
							
								      } finally {
							 | 
						||
| 
								 | 
							
								        throw e;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } cleanupSubscription(subscription);
							 | 
						||
| 
								 | 
							
								    return value;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  complete: function complete(value) {
							 | 
						||
| 
								 | 
							
								    var subscription = this._s;
							 | 
						||
| 
								 | 
							
								    if (!subscriptionClosed(subscription)) {
							 | 
						||
| 
								 | 
							
								      var observer = subscription._o;
							 | 
						||
| 
								 | 
							
								      subscription._o = undefined;
							 | 
						||
| 
								 | 
							
								      try {
							 | 
						||
| 
								 | 
							
								        var m = getMethod(observer.complete);
							 | 
						||
| 
								 | 
							
								        value = m ? m.call(observer, value) : undefined;
							 | 
						||
| 
								 | 
							
								      } catch (e) {
							 | 
						||
| 
								 | 
							
								        try {
							 | 
						||
| 
								 | 
							
								          cleanupSubscription(subscription);
							 | 
						||
| 
								 | 
							
								        } finally {
							 | 
						||
| 
								 | 
							
								          throw e;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      } cleanupSubscription(subscription);
							 | 
						||
| 
								 | 
							
								      return value;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var $Observable = function Observable(subscriber) {
							 | 
						||
| 
								 | 
							
								  anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								redefineAll($Observable.prototype, {
							 | 
						||
| 
								 | 
							
								  subscribe: function subscribe(observer) {
							 | 
						||
| 
								 | 
							
								    return new Subscription(observer, this._f);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  forEach: function forEach(fn) {
							 | 
						||
| 
								 | 
							
								    var that = this;
							 | 
						||
| 
								 | 
							
								    return new (core.Promise || global.Promise)(function (resolve, reject) {
							 | 
						||
| 
								 | 
							
								      aFunction(fn);
							 | 
						||
| 
								 | 
							
								      var subscription = that.subscribe({
							 | 
						||
| 
								 | 
							
								        next: function (value) {
							 | 
						||
| 
								 | 
							
								          try {
							 | 
						||
| 
								 | 
							
								            return fn(value);
							 | 
						||
| 
								 | 
							
								          } catch (e) {
							 | 
						||
| 
								 | 
							
								            reject(e);
							 | 
						||
| 
								 | 
							
								            subscription.unsubscribe();
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        error: reject,
							 | 
						||
| 
								 | 
							
								        complete: resolve
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								redefineAll($Observable, {
							 | 
						||
| 
								 | 
							
								  from: function from(x) {
							 | 
						||
| 
								 | 
							
								    var C = typeof this === 'function' ? this : $Observable;
							 | 
						||
| 
								 | 
							
								    var method = getMethod(anObject(x)[OBSERVABLE]);
							 | 
						||
| 
								 | 
							
								    if (method) {
							 | 
						||
| 
								 | 
							
								      var observable = anObject(method.call(x));
							 | 
						||
| 
								 | 
							
								      return observable.constructor === C ? observable : new C(function (observer) {
							 | 
						||
| 
								 | 
							
								        return observable.subscribe(observer);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return new C(function (observer) {
							 | 
						||
| 
								 | 
							
								      var done = false;
							 | 
						||
| 
								 | 
							
								      microtask(function () {
							 | 
						||
| 
								 | 
							
								        if (!done) {
							 | 
						||
| 
								 | 
							
								          try {
							 | 
						||
| 
								 | 
							
								            if (forOf(x, false, function (it) {
							 | 
						||
| 
								 | 
							
								              observer.next(it);
							 | 
						||
| 
								 | 
							
								              if (done) return RETURN;
							 | 
						||
| 
								 | 
							
								            }) === RETURN) return;
							 | 
						||
| 
								 | 
							
								          } catch (e) {
							 | 
						||
| 
								 | 
							
								            if (done) throw e;
							 | 
						||
| 
								 | 
							
								            observer.error(e);
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								          } observer.complete();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      return function () { done = true; };
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  of: function of() {
							 | 
						||
| 
								 | 
							
								    for (var i = 0, l = arguments.length, items = new Array(l); i < l;) items[i] = arguments[i++];
							 | 
						||
| 
								 | 
							
								    return new (typeof this === 'function' ? this : $Observable)(function (observer) {
							 | 
						||
| 
								 | 
							
								      var done = false;
							 | 
						||
| 
								 | 
							
								      microtask(function () {
							 | 
						||
| 
								 | 
							
								        if (!done) {
							 | 
						||
| 
								 | 
							
								          for (var j = 0; j < items.length; ++j) {
							 | 
						||
| 
								 | 
							
								            observer.next(items[j]);
							 | 
						||
| 
								 | 
							
								            if (done) return;
							 | 
						||
| 
								 | 
							
								          } observer.complete();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      return function () { done = true; };
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								hide($Observable.prototype, OBSERVABLE, function () { return this; });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$export($export.G, { Observable: $Observable });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								require('./_set-species')('Observable');
							 |