Class: RangeCompacter::Compacter

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

Instance Method Summary collapse

Constructor Details

#initialize(*items) ⇒ Compacter

Returns a new instance of Compacter.



7
8
9
# File 'lib/range_compacter.rb', line 7

def initialize(*items)
  @items = items
end

Instance Method Details

#compact(target_range) ⇒ Object

Main logic



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/range_compacter.rb', line 12

def compact(target_range)
  result = []

  target_items = @items.select do |item|
    item.cover?(target_range.begin) || target_range.cover?(item.begin)
  end.sort_by(&:begin)

  target_items.each_with_index do |item, idx|
    next if result.flatten.include?(item)

    if item.begin <= target_range.begin && item.end >= target_range.end
      result << item
    else
      item_to_compact = target_items[idx..].bsearch do |i|
        item.end <= i.begin && !result.flatten.include?(i)
      end
      if item_to_compact
        result << [item, item_to_compact]
      else
        result << item
      end
    end
  end
  result
end