Class | Range |
In: |
lib/core/facets/range/within.rb
lib/core/facets/range/to_r.rb lib/core/facets/range/combine.rb lib/core/facets/range/overlap.rb |
Parent: | Object |
Combine intervals.
Range.combine(1..2, 2..4) #=> [1..4] Range.combine(1..2, 3..4) #=> [1..2, 3..4]
CREDIT: Trans
# File lib/core/facets/range/combine.rb, line 23 23: def self.combine(*intervals) 24: intype = intervals.first.class 25: result = [] 26: 27: intervals = intervals.collect do |i| 28: [i.first, i.last] 29: end 30: 31: intervals.sort.each do |(from, to)| #inject([]) do |result, 32: if result.empty? or from > result.last[1] 33: result << [from, to] 34: elsif to > result.last[1] 35: result.last[1] = to 36: end 37: #result 38: end 39: 40: if intype <= Range 41: result.collect{ |i| ((i.first)..(i.last)) } 42: else 43: result 44: end 45: end
Combine ranges.
(1..2).combine(2..4) #=> [1..4] (1..2).combine(3..4) #=> [1..2, 3..4] TODO: Incorporate end-sentinal inclusion vs. exclusion.
CREDIT: Trans
# File lib/core/facets/range/combine.rb, line 12 12: def combine(*intervals) 13: Range.combine(self, *intervals) 14: end
A thing really should know itself. This simply returns self.
CREDIT: Trans
# File lib/core/facets/range/to_r.rb, line 8 8: def to_r 9: self 10: end
Returns a two element array of the relationship between two Ranges.
Diagram:
Relationship Returns self |-----------| r |-----------| [0,0] self |-----------| r |---------| [-1,-1] self |---------| r |-----------| [1,1] self |-----------| r |----------| [-1,0] self |-----------| r |-----------| [-1,1] etc.
Example:
(0..3).umbrella(1..2) #=> [-1,-1]
CREDIT: Trans, Chris Kappler
# File lib/core/facets/range/within.rb, line 49 49: def umbrella(r) 50: s = first <=> r.first 51: e = r.last <=> last 52: 53: if e == 0 54: if r.exclude_end? and exclude_end? 55: e = r.max <=> max 56: else 57: e = (r.exclude_end? ? 0 : 1) <=> (exclude_end? ? 0 : 1) 58: end 59: end 60: 61: return s,e 62: end
Uses the Range#umbrella method to determine if another Range is anywhere within this Range.
(1..3).within?(0..4) #=> true
CREDIT: Trans
# File lib/core/facets/range/within.rb, line 10 10: def within?(rng) 11: case rng.umbrella(self) 12: when [0,0], [-1,0], [0,-1], [-1,-1] 13: return true 14: else 15: return false 16: end 17: end