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