Sha256: a6390074f360897db47f473a6fdf862c828a83700c45865afd60b7e059a3e759

Contents?: true

Size: 1.29 KB

Versions: 1

Compression:

Stored size: 1.29 KB

Contents

# -*- encoding: utf-8 -*-

module Bluepill
  module Util
   class RotationalArray < Array
     def initialize(size)
       super(size)

       @capacity = size
       @counter = 0
     end

     def push(value)
       idx = rotational_idx(@counter)
       self[idx] = value

       @counter += 1
       self
     end

     alias_method :<<, :push

     def pop
       raise "Cannot call pop on a rotational array"
     end

     def shift
       raise "Cannot call shift on a rotational array"
     end

     def unshift
       raise "Cannot call unshift on a rotational array"
     end

     def last
       return if @counter.zero?

       self[rotational_idx(@counter - 1)]
     end

     def first
       return if @counter.zero?
       return self[0] if @counter <= @capacity

      self[rotational_idx(@counter)]
     end

     def clear
      @counter = 0
      super
     end

     def each(&block)
       times = @counter >= @capacity ? @capacity : @counter
       start = @counter >= @capacity ? rotational_idx(@counter) : 0
       times.times do |i|
         block.call(self[rotational_idx(start + i)])
       end
     end

     unless method_defined?(:nitems)
       def nitems
         compact.length
       end
     end

     private

     def rotational_idx(idx)
       idx % @capacity
     end
   end
 end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
evented_bluepill-0.0.47 lib/bluepill/util/rotational_array.rb