Lewerow/Zurvan

View on GitHub
detail/TimerRepository.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
'use strict';
var UIDManager = require('./utils/UIDManager');

function TimerRepository(config, sequenceGenerator) {
  this.config = config;
  this._sequenceGenerator = sequenceGenerator;
  this.uidManager = new UIDManager();
  this.uidManager.setUp(this.config.throwOnInvalidClearTimer, 'timer');
  this.timers = [];
}

TimerRepository.prototype.insertTimer = function(timer) {
  if (!timer.uid) {
    timer.uid = this.uidManager.getUid();
  }
  timer.sequenceNumber = this._sequenceGenerator.generate();

  var i;
  for (i = 0; i < this.timers.length; ++i) {
    // JS timers have no more than 1ms resolution
    if (this.timers[i].dueTime.isLongerThan(timer.dueTime)) {
      break;
    }
  }

  this.timers.splice(i, 0, timer);
  return timer.uid;
};

TimerRepository.prototype.clearTimer = function(uid) {
  if (!this.uidManager.isAcceptableUid(uid)) {
    return;
  }

  var i;
  for (i = 0; i < this.timers.length; ++i) {
    if (this.timers[i].uid === uid) {
      this.timers.splice(i, 1);
      break;
    }
  }
};

TimerRepository.prototype.releaseAll = function() {
  var earlierTimers = this.timers;
  this.timers = [];
  this.uidManager.clear();

  return earlierTimers;
};

TimerRepository.prototype.nextTimers = function() {
  var firstTimer = this.timers[0];
  if (!firstTimer) {
    return [];
  }

  return this.timers.filter(function(timer) {
    return timer.dueTime.isEqualTo(firstTimer.dueTime);
  });
};

TimerRepository.prototype.lastTimer = function() {
  return this.timers[this.timers.length - 1];
};

module.exports = TimerRepository;