| 'use strict'; | 
| // https://github.com/tc39/proposal-observable | 
| var $ = require('../internals/export'); | 
| var call = require('../internals/function-call'); | 
| var DESCRIPTORS = require('../internals/descriptors'); | 
| var setSpecies = require('../internals/set-species'); | 
| var aCallable = require('../internals/a-callable'); | 
| var anObject = require('../internals/an-object'); | 
| var anInstance = require('../internals/an-instance'); | 
| var isCallable = require('../internals/is-callable'); | 
| var isNullOrUndefined = require('../internals/is-null-or-undefined'); | 
| var isObject = require('../internals/is-object'); | 
| var getMethod = require('../internals/get-method'); | 
| var defineBuiltIn = require('../internals/define-built-in'); | 
| var defineBuiltIns = require('../internals/define-built-ins'); | 
| var defineBuiltInAccessor = require('../internals/define-built-in-accessor'); | 
| var hostReportErrors = require('../internals/host-report-errors'); | 
| var wellKnownSymbol = require('../internals/well-known-symbol'); | 
| var InternalStateModule = require('../internals/internal-state'); | 
|   | 
| var $$OBSERVABLE = wellKnownSymbol('observable'); | 
| var OBSERVABLE = 'Observable'; | 
| var SUBSCRIPTION = 'Subscription'; | 
| var SUBSCRIPTION_OBSERVER = 'SubscriptionObserver'; | 
| var getterFor = InternalStateModule.getterFor; | 
| var setInternalState = InternalStateModule.set; | 
| var getObservableInternalState = getterFor(OBSERVABLE); | 
| var getSubscriptionInternalState = getterFor(SUBSCRIPTION); | 
| var getSubscriptionObserverInternalState = getterFor(SUBSCRIPTION_OBSERVER); | 
|   | 
| var SubscriptionState = function (observer) { | 
|   this.observer = anObject(observer); | 
|   this.cleanup = null; | 
|   this.subscriptionObserver = null; | 
| }; | 
|   | 
| SubscriptionState.prototype = { | 
|   type: SUBSCRIPTION, | 
|   clean: function () { | 
|     var cleanup = this.cleanup; | 
|     if (cleanup) { | 
|       this.cleanup = null; | 
|       try { | 
|         cleanup(); | 
|       } catch (error) { | 
|         hostReportErrors(error); | 
|       } | 
|     } | 
|   }, | 
|   close: function () { | 
|     if (!DESCRIPTORS) { | 
|       var subscription = this.facade; | 
|       var subscriptionObserver = this.subscriptionObserver; | 
|       subscription.closed = true; | 
|       if (subscriptionObserver) subscriptionObserver.closed = true; | 
|     } this.observer = null; | 
|   }, | 
|   isClosed: function () { | 
|     return this.observer === null; | 
|   } | 
| }; | 
|   | 
| var Subscription = function (observer, subscriber) { | 
|   var subscriptionState = setInternalState(this, new SubscriptionState(observer)); | 
|   var start; | 
|   if (!DESCRIPTORS) this.closed = false; | 
|   try { | 
|     if (start = getMethod(observer, 'start')) call(start, observer, this); | 
|   } catch (error) { | 
|     hostReportErrors(error); | 
|   } | 
|   if (subscriptionState.isClosed()) return; | 
|   var subscriptionObserver = subscriptionState.subscriptionObserver = new SubscriptionObserver(subscriptionState); | 
|   try { | 
|     var cleanup = subscriber(subscriptionObserver); | 
|     var subscription = cleanup; | 
|     if (!isNullOrUndefined(cleanup)) subscriptionState.cleanup = isCallable(cleanup.unsubscribe) | 
|       ? function () { subscription.unsubscribe(); } | 
|       : aCallable(cleanup); | 
|   } catch (error) { | 
|     subscriptionObserver.error(error); | 
|     return; | 
|   } if (subscriptionState.isClosed()) subscriptionState.clean(); | 
| }; | 
|   | 
| Subscription.prototype = defineBuiltIns({}, { | 
|   unsubscribe: function unsubscribe() { | 
|     var subscriptionState = getSubscriptionInternalState(this); | 
|     if (!subscriptionState.isClosed()) { | 
|       subscriptionState.close(); | 
|       subscriptionState.clean(); | 
|     } | 
|   } | 
| }); | 
|   | 
| if (DESCRIPTORS) defineBuiltInAccessor(Subscription.prototype, 'closed', { | 
|   configurable: true, | 
|   get: function closed() { | 
|     return getSubscriptionInternalState(this).isClosed(); | 
|   } | 
| }); | 
|   | 
| var SubscriptionObserver = function (subscriptionState) { | 
|   setInternalState(this, { | 
|     type: SUBSCRIPTION_OBSERVER, | 
|     subscriptionState: subscriptionState | 
|   }); | 
|   if (!DESCRIPTORS) this.closed = false; | 
| }; | 
|   | 
| SubscriptionObserver.prototype = defineBuiltIns({}, { | 
|   next: function next(value) { | 
|     var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState; | 
|     if (!subscriptionState.isClosed()) { | 
|       var observer = subscriptionState.observer; | 
|       try { | 
|         var nextMethod = getMethod(observer, 'next'); | 
|         if (nextMethod) call(nextMethod, observer, value); | 
|       } catch (error) { | 
|         hostReportErrors(error); | 
|       } | 
|     } | 
|   }, | 
|   error: function error(value) { | 
|     var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState; | 
|     if (!subscriptionState.isClosed()) { | 
|       var observer = subscriptionState.observer; | 
|       subscriptionState.close(); | 
|       try { | 
|         var errorMethod = getMethod(observer, 'error'); | 
|         if (errorMethod) call(errorMethod, observer, value); | 
|         else hostReportErrors(value); | 
|       } catch (err) { | 
|         hostReportErrors(err); | 
|       } subscriptionState.clean(); | 
|     } | 
|   }, | 
|   complete: function complete() { | 
|     var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState; | 
|     if (!subscriptionState.isClosed()) { | 
|       var observer = subscriptionState.observer; | 
|       subscriptionState.close(); | 
|       try { | 
|         var completeMethod = getMethod(observer, 'complete'); | 
|         if (completeMethod) call(completeMethod, observer); | 
|       } catch (error) { | 
|         hostReportErrors(error); | 
|       } subscriptionState.clean(); | 
|     } | 
|   } | 
| }); | 
|   | 
| if (DESCRIPTORS) defineBuiltInAccessor(SubscriptionObserver.prototype, 'closed', { | 
|   configurable: true, | 
|   get: function closed() { | 
|     return getSubscriptionObserverInternalState(this).subscriptionState.isClosed(); | 
|   } | 
| }); | 
|   | 
| var $Observable = function Observable(subscriber) { | 
|   anInstance(this, ObservablePrototype); | 
|   setInternalState(this, { | 
|     type: OBSERVABLE, | 
|     subscriber: aCallable(subscriber) | 
|   }); | 
| }; | 
|   | 
| var ObservablePrototype = $Observable.prototype; | 
|   | 
| defineBuiltIns(ObservablePrototype, { | 
|   subscribe: function subscribe(observer) { | 
|     var length = arguments.length; | 
|     return new Subscription(isCallable(observer) ? { | 
|       next: observer, | 
|       error: length > 1 ? arguments[1] : undefined, | 
|       complete: length > 2 ? arguments[2] : undefined | 
|     } : isObject(observer) ? observer : {}, getObservableInternalState(this).subscriber); | 
|   } | 
| }); | 
|   | 
| defineBuiltIn(ObservablePrototype, $$OBSERVABLE, function () { return this; }); | 
|   | 
| $({ global: true, constructor: true, forced: true }, { | 
|   Observable: $Observable | 
| }); | 
|   | 
| setSpecies(OBSERVABLE); |