text: import Clock from '../clock/Clock.js';
  import Timer from './Timer.js';
  import Pool from './TimerPool.js';
  
  const GetValue = Phaser.Utils.Objects.GetValue;
  const TimerPool = new Pool();
  
  class Timeline extends Clock {
      constructor(parent, config) {
          super(parent, config);
  
          this.addedTimers = [];
          this.timers = [];
          this.timerPool = GetValue(config, 'pool', TimerPool);
      }
  
      shutdown() {
          // Already shutdown
          if (this.isShutdown) {
              return;
          }
  
          this.timerPool
              .freeMultiple(this.addedTimers)
              .freeMultiple(this.timers);
  
          this.timerPool = undefined;
          this.addedTimers = undefined;
          this.timers = undefined;
  
          super.shutdown();
      }
  
      addTimer(config) {
          var timer = this.timerPool.allocate();
          if (!timer) {
              timer = new Timer(this, config)
          } else {
              timer
                  .setTimeline(this)
                  .reset(config)
          }
          this.addedTimers.push(timer);
          timer.runCallback(timer.onStart);
  
          if (!this.isRunning) {
              this.start();
          }
          return timer;
      }
  
      delayCall(delay, callback, args, scope) {
          var timer = this.addTimer({
              duration: delay,
              onComplete: function (target, t, timer) {
                  if (args === undefined) {
                      args = [];
                  }
                  args.push(timer);
                  callback.apply(scope, args);
              }
          })
          return timer;
      }
  
      getTimers(name) {
          var timers = [];
  
          var timerQueues = [this.addedTimers, this.timers];
          for (var ti = 0, tcnt = timerQueues.length; ti < tcnt; ti++) {
              var timerQueue = timerQueues[ti];
              for (var i = 0, cnt = timerQueue.length; i < cnt; i++) {
                  var timer = timerQueue[i];
                  if (timer.name === name) {
                      timers.push(timer);
                  }
              }
          }
          return timers;
      }
  
      update(time, delta) {
          super.update(time, delta);
  
          this.timers.push(...this.addedTimers);
          this.addedTimers.length = 0;
          var pendingTimers = [];
          for (var i = 0, cnt = this.timers.length; i < cnt; i++) {
              var timer = this.timers[i];
              var isStopped = timer.update(this.now, this.delta);
              if (isStopped) {
                  this.timerPool.free(timer);  // Free timer
              } else {
                  pendingTimers.push(timer);  // Add to timer queue
              }
          }
          this.timers = pendingTimers;
  
          if ((this.timers.length === 0) && (this.addedTimers.length === 0)) {
              this.complete(); // Emit 'complete' event
          }
      }
  }
  
  export default Timeline