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
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
|