drecom/barrage

View on GitHub
lib/barrage.rb

Summary

Maintainability
A
35 mins
Test Coverage
require "barrage/version"
require "active_support/core_ext/string/inflections"

class Barrage
  class InvalidOption < StandardError; end
  attr_reader :generators

  #
  # generators:
  #   - name: msec
  #     length: 40
  #     start_at: 1396278000000 # 2014-04-01 00:00:00 +0900 (msec)
  #   - name: pid
  #     length: 16
  #   - name: sequence
  #     length: 8

  def initialize(options = {})
    @options = options
    @lock = Mutex.new
    @generators = @options["generators"].map do |h|
      generator_name = h["name"]
      require "barrage/generators/#{generator_name}"
      "Barrage::Generators::#{generator_name.classify}".constantize.new(h)
    end
  end

  def generate
    @lock.synchronize {
      shift_size = length
      @generators.inject(0) do |result, generator|
        shift_size = shift_size - generator.length
        result += generator.generate << shift_size
      end
    }
  end
  alias_method :next, :generate

  def current
    @lock.synchronize {
      shift_size = length
      @generators.inject(0) do |result, generator|
        shift_size = shift_size - generator.length
        result += generator.current << shift_size
      end
    }
  end

  def length
    @generators.inject(0) {|sum, g| sum += g.length }
  end
end

require "barrage/generators"