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
						
					
					
				'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');
 |