Class: SetOfRanges::Set

Inherits:
Set
  • Object
show all
Defined in:
lib/set_of_ranges/set.rb

Instance Method Summary collapse

Instance Method Details

#<<(obj) ⇒ Object



44
45
46
# File 'lib/set_of_ranges/set.rb', line 44

def << obj
  add(obj)
end

#add(obj) ⇒ Object

Raises:

  • (ArgumentError)


5
6
7
8
9
10
11
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
37
38
39
40
41
42
# File 'lib/set_of_ranges/set.rb', line 5

def add(obj)
  raise ArgumentError if obj.nil?
  raise ArgumentError unless obj.is_a? Range
  rng = obj.exclude_end? ? (obj.begin..(obj.end-1)) : obj

  if empty?
    super(rng)
  else

    overlapping_ranges = Set.new
    each do |r|
      if r.begin <= rng.begin and r.end >= rng.end

        # new range is completely contained within an 
        # existing range don't need to modify anything
        return self
      elsif (rng.begin < r.begin and rng.end >= r.begin - 1) or
          (rng.end > r.end and rng.begin <= r.end + 1)
        overlapping_ranges << r
      end
    end

    if overlapping_ranges.size == 0

      super(rng)

    else

      subtract(overlapping_ranges)
      overlapping_ranges << rng
      min = overlapping_ranges.map(&:begin).min
      max = overlapping_ranges.map(&:end).max
      super(min..max)
    end
  end

  self
end

#merge(enum) ⇒ Object



48
49
50
51
52
53
# File 'lib/set_of_ranges/set.rb', line 48

def merge enum
  enum.each do |e|
    add(e)
  end
  self
end

#replace(enum) ⇒ Object



55
56
57
58
# File 'lib/set_of_ranges/set.rb', line 55

def replace enum
  clear
  merge(enum)
end