Methods
Public Class methods
combine(*intervals)

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

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
  def combine(*intervals)
    Range.combine(self, *intervals)
  end
overlap?(other)

Do two ranges overlap?

  CREDIT: Daniel Schierbeck
  CREDIT: Brandon Keepers
# File lib/core/facets/range/overlap.rb, line 8
  def overlap?(other)
    include?(other.first) or other.include?(first)
  end
to_r()

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

CREDIT: Trans

# File lib/core/facets/range/to_r.rb, line 8
  def to_r
    self
  end
to_range()

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/core/facets/range/to_r.rb, line 21
  def to_range
    self
  end
umbrella(r)

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
  CREDIT: Chris Kappler
# File lib/core/facets/range/within.rb, line 50
  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)

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
  def within?(rng)
    case rng.umbrella(self)
    when [0,0], [-1,0], [0,-1], [-1,-1]
      return true
    else
      return false
    end
  end