Class: TestIds::BinArray

Inherits:
Object
  • Object
show all
Defined in:
lib/test_ids/bin_array.rb

Instance Method Summary collapse

Constructor Details

#initializeBinArray

Returns a new instance of BinArray.



3
4
5
# File 'lib/test_ids/bin_array.rb', line 3

def initialize
  @store = []
end

Instance Method Details

#<<(val) ⇒ Object



7
8
9
10
11
12
13
14
15
# File 'lib/test_ids/bin_array.rb', line 7

def <<(val)
  @store += Array(val)
  @store = @store.sort do |a, b|
    a = a.min if a.is_a?(Range)
    b = b.min if b.is_a?(Range)
    a <=> b
  end
  nil
end

#empty?Boolean

Returns:

  • (Boolean)


17
18
19
# File 'lib/test_ids/bin_array.rb', line 17

def empty?
  @store.empty?
end

#freezeObject



21
22
23
# File 'lib/test_ids/bin_array.rb', line 21

def freeze
  @store.freeze
end

#include?(bin) ⇒ Boolean

Returns true if the array contains the given bin number

Returns:

  • (Boolean)


26
27
28
29
30
# File 'lib/test_ids/bin_array.rb', line 26

def include?(bin)
  @store.any? do |v|
    v == bin || (v.is_a?(Range) && bin >= v.min && bin <= v.max)
  end
end

#maxObject



94
95
96
97
98
99
100
101
# File 'lib/test_ids/bin_array.rb', line 94

def max
  v = @store.last
  if v.is_a?(Range)
    v.max
  else
    v
  end
end

#minObject



85
86
87
88
89
90
91
92
# File 'lib/test_ids/bin_array.rb', line 85

def min
  v = @store.first
  if v.is_a?(Range)
    v.min
  else
    v
  end
end

#next(after = nil) ⇒ Object

Returns the next bin in the array, starting from the first and remembering the last bin when called the next time. A bin can optionally be supplied in which case the internal pointer will be reset and the next bin that occurs after the given number will be returned.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/test_ids/bin_array.rb', line 36

def next(after = nil)
  if after
    # Need to work out the pointer here as it is probably out of sync with the
    # last value now
    @pointer = nil
    i = 0
    until @pointer
      v = @store[i]
      if v
        if after == v || (v.is_a?(Range) && after >= v.min && after <= v.max)
          @pointer = i
          @next = after
        elsif after < min_val(v)
          @pointer = previous_pointer(i)
          @next = min_val(v) - 1
        end
      else
        # Gone past the end of the array
        @pointer = @store.size - 1
        @next = min_val(@store[0]) - 1
      end
      i += 1
    end
  end
  if @next
    @pointer ||= 0
    if @store[@pointer].is_a?(Range) && @next != @store[@pointer].max
      @next += 1
    else
      @pointer += 1
      # Return nil when we get to the end of the array
      if @pointer == @store.size
        @pointer -= 1
        return nil
      end
      @next = @store[@pointer]
      @next = @next.min if @next.is_a?(Range)
    end
  else
    v = @store.first
    if v.is_a?(Range)
      @next = v.min
    else
      @next = v
    end
  end
  @next
end