Class: TestProf::Utils::SizedOrderedSet

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/test_prof/utils/sized_ordered_set.rb

Overview

Ordered set with capacity

Instance Method Summary collapse

Constructor Details

#initialize(max_size, sort_by: nil) ⇒ SizedOrderedSet

Returns a new instance of SizedOrderedSet.



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/test_prof/utils/sized_ordered_set.rb', line 14

def initialize(max_size, sort_by: nil)
  @max_size = max_size
  @comparator =
    if block_given?
      Proc.new
    elsif !sort_by.nil?
      ->(x, y) { x[sort_by] >= y[sort_by] }
    else
      ->(x, y) { x >= y }
    end
  @data = []
end

Instance Method Details

#<<(item) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/test_prof/utils/sized_ordered_set.rb', line 27

def <<(item)
  return if data.size == max_size &&
    comparator.call(data.last, item)

  # Find an index of a smaller element
  index = data.bsearch_index { |x| !comparator.call(x, item) }

  if index.nil?
    data << item
  else
    data.insert(index, item)
  end

  data.pop if data.size > max_size
  data.size
end

#eachObject



44
45
46
47
48
49
50
# File 'lib/test_prof/utils/sized_ordered_set.rb', line 44

def each
  if block_given?
    data.each(&Proc.new)
  else
    data.each
  end
end

#sizeObject



52
53
54
# File 'lib/test_prof/utils/sized_ordered_set.rb', line 52

def size
  data.size
end

#to_aObject



56
57
58
# File 'lib/test_prof/utils/sized_ordered_set.rb', line 56

def to_a
  data.dup
end