{"ast":null,"code":"import { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function delayWhen(delayDurationSelector, subscriptionDelay) {\n  if (subscriptionDelay) {\n    return source => new SubscriptionDelayObservable(source, subscriptionDelay).lift(new DelayWhenOperator(delayDurationSelector));\n  }\n\n  return source => source.lift(new DelayWhenOperator(delayDurationSelector));\n}\n\nclass DelayWhenOperator {\n  constructor(delayDurationSelector) {\n    this.delayDurationSelector = delayDurationSelector;\n  }\n\n  call(subscriber, source) {\n    return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));\n  }\n\n}\n\nclass DelayWhenSubscriber extends OuterSubscriber {\n  constructor(destination, delayDurationSelector) {\n    super(destination);\n    this.delayDurationSelector = delayDurationSelector;\n    this.completed = false;\n    this.delayNotifierSubscriptions = [];\n    this.index = 0;\n  }\n\n  notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n    this.destination.next(outerValue);\n    this.removeSubscription(innerSub);\n    this.tryComplete();\n  }\n\n  notifyError(error, innerSub) {\n    this._error(error);\n  }\n\n  notifyComplete(innerSub) {\n    const value = this.removeSubscription(innerSub);\n\n    if (value) {\n      this.destination.next(value);\n    }\n\n    this.tryComplete();\n  }\n\n  _next(value) {\n    const index = this.index++;\n\n    try {\n      const delayNotifier = this.delayDurationSelector(value, index);\n\n      if (delayNotifier) {\n        this.tryDelay(delayNotifier, value);\n      }\n    } catch (err) {\n      this.destination.error(err);\n    }\n  }\n\n  _complete() {\n    this.completed = true;\n    this.tryComplete();\n    this.unsubscribe();\n  }\n\n  removeSubscription(subscription) {\n    subscription.unsubscribe();\n    const subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);\n\n    if (subscriptionIdx !== -1) {\n      this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);\n    }\n\n    return subscription.outerValue;\n  }\n\n  tryDelay(delayNotifier, value) {\n    const notifierSubscription = subscribeToResult(this, delayNotifier, value);\n\n    if (notifierSubscription && !notifierSubscription.closed) {\n      const destination = this.destination;\n      destination.add(notifierSubscription);\n      this.delayNotifierSubscriptions.push(notifierSubscription);\n    }\n  }\n\n  tryComplete() {\n    if (this.completed && this.delayNotifierSubscriptions.length === 0) {\n      this.destination.complete();\n    }\n  }\n\n}\n\nclass SubscriptionDelayObservable extends Observable {\n  constructor(source, subscriptionDelay) {\n    super();\n    this.source = source;\n    this.subscriptionDelay = subscriptionDelay;\n  }\n\n  _subscribe(subscriber) {\n    this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));\n  }\n\n}\n\nclass SubscriptionDelaySubscriber extends Subscriber {\n  constructor(parent, source) {\n    super();\n    this.parent = parent;\n    this.source = source;\n    this.sourceSubscribed = false;\n  }\n\n  _next(unused) {\n    this.subscribeToSource();\n  }\n\n  _error(err) {\n    this.unsubscribe();\n    this.parent.error(err);\n  }\n\n  _complete() {\n    this.unsubscribe();\n    this.subscribeToSource();\n  }\n\n  subscribeToSource() {\n    if (!this.sourceSubscribed) {\n      this.sourceSubscribed = true;\n      this.unsubscribe();\n      this.source.subscribe(this.parent);\n    }\n  }\n\n} //# sourceMappingURL=delayWhen.js.map","map":null,"metadata":{},"sourceType":"module"}