class Range

Public Class Methods

combine(*intervals) click to toggle source

Combine intervals.

Range.combine(1..2, 2..4)   #=> [1..4]
Range.combine(1..2, 3..4)   #=> [1..2, 3..4]

CREDIT: Trans

# File lib/facets/range/combine.rb, line 23
def self.combine(*intervals)
  intype = intervals.first.class
  result = []

  intervals = intervals.collect do |i|
    [i.first, i.last]
  end

  intervals.sort.each do |(from, to)|  #inject([]) do |result,
    if result.empty? or from > result.last[1]
      result << [from, to]
    elsif to > result.last[1]
      result.last[1] = to
    end
    #result
  end

  if intype <= Range
    result.collect{ |i| ((i.first)..(i.last)) }
  else
    result
  end
end

Public Instance Methods

combine(*intervals) click to toggle source

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/facets/range/combine.rb, line 12
def combine(*intervals)
  Range.combine(self, *intervals)
end
overlap?(other) click to toggle source

Do two ranges overlap?

CREDIT: Daniel Schierbeck, Brandon Keepers

# File lib/facets/range/overlap.rb, line 7
def overlap?(other)
  include?(other.first) or other.include?(first)
end
quantile(k, n=100) click to toggle source

Calculate the kth n-tile in a range.

If n=4 the quantity is called a quartile, and if n=100 it is called a percentile.

@uncommon

require 'facets/range/quantile'

@return [Integer] the kth n-tile

# File lib/facets/range/quantile.rb, line 12
def quantile(k, n=100)
  return 1 if k < first
  return n if k >= last
  ((k - first) / ((last - first) / n.to_f)).to_i + 1
end
to_r() click to toggle source

A thing really should know itself. This simply returns self.

CREDIT: Trans

# File lib/facets/range/to_r.rb, line 8
def to_r
  self
end
to_range() click to toggle source

A thing really should know itself. This simply returns self.

Note: This does not internally effect the Ruby interpretor such that it can coerce Range-like objects into a Range.

CREDIT: Trans

# File lib/facets/range/to_r.rb, line 21
def to_range
  self
end
umbrella(r) click to toggle source

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/facets/range/within.rb, line 49
def umbrella(r)
  s = first <=> r.first
  e = r.last <=> last

  if e == 0
    if r.exclude_end? and exclude_end?
      e = r.max <=> max
    else
      e = (r.exclude_end? ? 0 : 1) <=> (exclude_end? ? 0 : 1)
    end
  end

  return s,e
end
within?(rng) click to toggle source

Uses the #umbrella method to determine if another Range is anywhere within this Range.

(1..3).within?(0..4)  #=> true

CREDIT: Trans

# File lib/facets/range/within.rb, line 10
def within?(rng)
  case rng.umbrella(self)
  when [0,0], [-1,0], [0,-1], [-1,-1]
    return true
  else
    return false
  end
end