Class: ExtraRange::SparseRange

Inherits:
Object
  • Object
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

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

#dupObject



30
31
32
# File 'lib/extrarange/sparse_range.rb', line 30

def dup
  self.class.new *to_a
end

#eachObject



144
145
146
# File 'lib/extrarange/sparse_range.rb', line 144

def each
  to_a.each{ |o| yield o }
end

#each_rangeObject



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

Returns:

  • (Boolean)


152
153
154
# File 'lib/extrarange/sparse_range.rb', line 152

def empty?
  @ranges.empty?
end

#endObject Also known as: last



20
21
22
# File 'lib/extrarange/sparse_range.rb', line 20

def end
  @ranges.last().end
end

#exclude_end?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/extrarange/sparse_range.rb', line 26

def exclude_end?
  @ranges.last().exclude_end?
end

#hashObject

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?

Returns:

  • (Boolean)


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

#sizeObject



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_aObject



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