shageman/the_next_big_thing

View on GitHub
components/annoyance/app/models/annoyance/meter.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Annoyance
  class Meter
    attr_accessor :limit

    def initialize(limit)
      raise ArgumentError unless limit.is_a? Integer
      @limit = limit
    end

    def annoyance_level(repetition_count)
      raise ArgumentError unless limit.is_a? Integer
      return "" if repetition_count <= 0

      repetition_count -= 1

      index = repetition_count * Annoyance::Levels.levels.count/limit.to_f
      index_to_access = [index, Annoyance::Levels.levels.count - 1].min

      annoyance_level = Annoyance::Levels.levels[index_to_access]
      annoyance_level + what_to_duplicate(repetition_count, annoyance_level) * emphasis(repetition_count, index)
    end

    def annoyance_adjusted(text, repetition_count)
      if repetition_count < limit
        text + annoyance_level(repetition_count)
      else
        annoyance_level(repetition_count)
      end
    end

    private

    def emphasis(repetition_count, index)
      if repetition_count < limit
        if index - index.to_i != 0
          (1/(index - index.to_i)).ceil - 1
        else
          0
        end
      else
        repetition_count - limit + 1
      end
    end

    def what_to_duplicate(repetition_count, annoyance_level)
      repetition_count < limit ? annoyance_level[-1] : annoyance_level
    end
  end
end