Class: ExtraRange::SparseRange
- Inherits:
-
Object
- Object
- ExtraRange::SparseRange
show all
- Includes:
- Enumerable, RangeMath
- Defined in:
- lib/extrarange/sparse_range.rb
Instance Method Summary
collapse
Methods included from RangeMath
#adjacent?, #mask?, #overlap?
Constructor Details
#initialize(*ranges) ⇒ SparseRange
Returns a new instance of SparseRange.
9
10
11
12
|
# File 'lib/extrarange/sparse_range.rb', line 9
def initialize(*ranges)
@ranges = []
ranges.each { |r| self.add r }
end
|
Instance Method Details
#&(o) ⇒ Object
Also known as:
intersection
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
# File 'lib/extrarange/sparse_range.rb', line 83
def &(o)
ret = self.class.new
case o
when Range
@ranges.each do |r|
intersection = r & o
ret.add intersection if intersection
end
ret
when self.class
o.each_range do |i|
intersection = self & i
ret.add intersection if intersection
end
ret
when Enumerable
o.each do |i|
intersection = self & i
ret.add intersection if intersection
end
ret
else
self&(o..o)
end
end
|
#-(enum) ⇒ Object
Also known as:
difference
77
78
79
|
# File 'lib/extrarange/sparse_range.rb', line 77
def -(enum)
dup.delete(enum)
end
|
#==(rset) ⇒ Object
34
35
36
|
# File 'lib/extrarange/sparse_range.rb', line 34
def ==(rset)
@ranges == rset.instance_variable_get(:@ranges)
end
|
#add(o) ⇒ Object
Also known as:
<<
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/extrarange/sparse_range.rb', line 38
def add(o)
case o
when Range then
_add(o)
when self.class then
o.each_range { |b| add b }
when Enumerable then
o.each { |b| add b }
else
add(o..o)
end
return self
end
|
#begin ⇒ Object
Also known as:
first
14
15
16
|
# File 'lib/extrarange/sparse_range.rb', line 14
def begin
@ranges.first().begin
end
|
#delete(o) ⇒ Object
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
# File 'lib/extrarange/sparse_range.rb', line 55
def delete(o)
case o
when Range then
_delete(o)
when self.class then
o.each_range { |s| delete s }
when Enumerable then
o.each { |s| delete s }
else
delete(o..o)
end
return self
end
|
#dup ⇒ Object
30
31
32
|
# File 'lib/extrarange/sparse_range.rb', line 30
def dup
self.class.new *to_a
end
|
#each ⇒ Object
144
145
146
|
# File 'lib/extrarange/sparse_range.rb', line 144
def each
to_a.each{ |o| yield o }
end
|
#each_range ⇒ Object
156
157
158
|
# File 'lib/extrarange/sparse_range.rb', line 156
def each_range
@ranges.map { |r| r.to_range }.each { |o| yield o }
end
|
#empty? ⇒ Boolean
152
153
154
|
# File 'lib/extrarange/sparse_range.rb', line 152
def empty?
@ranges.empty?
end
|
#end ⇒ Object
Also known as:
last
20
21
22
|
# File 'lib/extrarange/sparse_range.rb', line 20
def end
@ranges.last().end
end
|
#exclude_end? ⇒ Boolean
26
27
28
|
# File 'lib/extrarange/sparse_range.rb', line 26
def exclude_end?
@ranges.last().exclude_end?
end
|
#hash ⇒ Object
BEWARE! SparseRange is mutable! it would be better to change its behaviour to return new sparseranges or to create a separate ImmutableSparseRange class.
115
116
117
|
# File 'lib/extrarange/sparse_range.rb', line 115
def hash
return @ranges.hash
end
|
#include?(elem) ⇒ Boolean
Also known as:
member?, cover?
129
130
131
|
# File 'lib/extrarange/sparse_range.rb', line 129
def include?(elem)
@ranges.any? { |r| r.include? elem }
end
|
#max(&block) ⇒ Object
119
120
121
122
|
# File 'lib/extrarange/sparse_range.rb', line 119
def max(&block)
maxes = @ranges.collect {|r| r.max(&block)}
(maxes.include? nil) ? nil : maxes.max(&block)
end
|
#min(&block) ⇒ Object
124
125
126
127
|
# File 'lib/extrarange/sparse_range.rb', line 124
def min(&block)
mins = @ranges.collect {|r| r.min(&block)}
(mins.include? nil) ? nil : mins.min(&block)
end
|
#size ⇒ Object
148
149
150
|
# File 'lib/extrarange/sparse_range.rb', line 148
def size
@ranges.inject(0) { |sum, n| sum + n.size }
end
|
#step(n = 1, &block) ⇒ Object
160
161
162
163
164
165
166
167
|
# File 'lib/extrarange/sparse_range.rb', line 160
def step(n=1, &block)
enumerator = to_a.select.with_index.select { |_, index| (index % n) == 0 }.collect { |x, _| x }
if block_given?
enumerator.each(&block)
else
return enumerator
end
end
|
#to_a ⇒ Object
140
141
142
|
# File 'lib/extrarange/sparse_range.rb', line 140
def to_a
@ranges.map { |r| r.to_a }.flatten
end
|
#|(enum) ⇒ Object
Also known as:
+, union
70
71
72
|
# File 'lib/extrarange/sparse_range.rb', line 70
def |(enum)
dup.add(enum)
end
|