Sha256: dad5917ffde61490f324cc00dc8b80109a393ad4820642a0c411a2b22ffd8f3b
Contents?: true
Size: 1.34 KB
Versions: 13
Compression:
Stored size: 1.34 KB
Contents
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
13 entries across 13 versions & 5 rubygems