{"ast":null,"code":"import { subscribeToResult } from '../util/subscribeToResult';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nexport function mergeScan(accumulator, seed, concurrent = Number.POSITIVE_INFINITY) {\n  return source => source.lift(new MergeScanOperator(accumulator, seed, concurrent));\n}\nexport class MergeScanOperator {\n  constructor(accumulator, seed, concurrent) {\n    this.accumulator = accumulator;\n    this.seed = seed;\n    this.concurrent = concurrent;\n  }\n\n  call(subscriber, source) {\n    return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));\n  }\n\n}\nexport class MergeScanSubscriber extends OuterSubscriber {\n  constructor(destination, accumulator, acc, concurrent) {\n    super(destination);\n    this.accumulator = accumulator;\n    this.acc = acc;\n    this.concurrent = concurrent;\n    this.hasValue = false;\n    this.hasCompleted = false;\n    this.buffer = [];\n    this.active = 0;\n    this.index = 0;\n  }\n\n  _next(value) {\n    if (this.active < this.concurrent) {\n      const index = this.index++;\n      const destination = this.destination;\n      let ish;\n\n      try {\n        const {\n          accumulator\n        } = this;\n        ish = accumulator(this.acc, value, index);\n      } catch (e) {\n        return destination.error(e);\n      }\n\n      this.active++;\n\n      this._innerSub(ish, value, index);\n    } else {\n      this.buffer.push(value);\n    }\n  }\n\n  _innerSub(ish, value, index) {\n    const innerSubscriber = new InnerSubscriber(this, value, index);\n    const destination = this.destination;\n    destination.add(innerSubscriber);\n    const innerSubscription = subscribeToResult(this, ish, undefined, undefined, innerSubscriber);\n\n    if (innerSubscription !== innerSubscriber) {\n      destination.add(innerSubscription);\n    }\n  }\n\n  _complete() {\n    this.hasCompleted = true;\n\n    if (this.active === 0 && this.buffer.length === 0) {\n      if (this.hasValue === false) {\n        this.destination.next(this.acc);\n      }\n\n      this.destination.complete();\n    }\n\n    this.unsubscribe();\n  }\n\n  notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n    const {\n      destination\n    } = this;\n    this.acc = innerValue;\n    this.hasValue = true;\n    destination.next(innerValue);\n  }\n\n  notifyComplete(innerSub) {\n    const buffer = this.buffer;\n    const destination = this.destination;\n    destination.remove(innerSub);\n    this.active--;\n\n    if (buffer.length > 0) {\n      this._next(buffer.shift());\n    } else if (this.active === 0 && this.hasCompleted) {\n      if (this.hasValue === false) {\n        this.destination.next(this.acc);\n      }\n\n      this.destination.complete();\n    }\n  }\n\n} //# sourceMappingURL=mergeScan.js.map","map":null,"metadata":{},"sourceType":"module"}