Method: RangeOperations::Array.subtract

Defined in:
lib/range_operations/array.rb

.subtract(range, subranges) ⇒ Object

Returns an array of ranges resulting from removing from range any parts overlapped by any of subranges.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/range_operations/array.rb', line 31

def self.subtract(range, subranges)
  simple = simplify(subranges)

  [].tap do |acc|
    start = range.begin

    simple.each do |sr|
      next if sr.end < start

      if sr.begin > start
        finish = [sr.begin, range.end].min
        acc << (start .. finish)
      end

      start = sr.end
      break if start > range.end
    end

    if start < range.end
      acc << (start .. range.end)
    end
  end
end