class Range

Public Instance Methods

&(other) click to toggle source

Finds the intersecting sub-range.

@param [Range] other

The other range.

@return [Range]

The intersecting sub-range.

@example

(1..100) & (20..200)
# => 20..100

@since 0.2.0

# File lib/combinatorics/extensions/range.rb, line 18
def &(other)
  Range.new(
    [self.first, other.first].max,
    [self.last, other.last].min
  )
end
downto(other) { |start..stop| ... } click to toggle source

Iterates over every sub-range down to the other range.

@param [Range] other

The lower bounding range.

@yield [subrange]

The given block will be passed every sub-range between the two ranges.

@yieldparam [Range] subrange

A sub-range bounded by the beginning of the other range and the
ending of the range.

@return [Enumerator]

If no block is given, an enumerator object will be returned.

@example

(2..7).downto(1..5).to_a
# => [2..7, 2..6, 2..5, 1..7, 1..6, 1..5]

@since 0.2.0

# File lib/combinatorics/extensions/range.rb, line 83
def downto(other)
  return enum_for(:downto,other) unless block_given?

  unless other.kind_of?(Range)
    raise(TypeError,"bad value for range",caller)
  end

  self.first.downto(other.first) do |start|
    self.last.downto(other.last) do |stop|
      yield start..stop
    end
  end
end
upto(other) { |start..stop| ... } click to toggle source

Iterates over every sub-range up to the other range.

@param [Range] other

The upper bounding range.

@yield [subrange]

The given block will be passed every sub-range between the two ranges.

@yieldparam [Range] subrange

A sub-range bounded by the beginning of the range and the ending of
the other range.

@return [Enumerator]

If no block is given, an enumerator object will be returned.

@example

(1..5).upto(2..7).to_a
# => [1..5, 1..6, 1..7, 2..5, 2..6, 2..7]

@since 0.2.0

# File lib/combinatorics/extensions/range.rb, line 47
def upto(other)
  return enum_for(:upto,other) unless block_given?

  unless other.kind_of?(Range)
    raise(TypeError,"bad value for range",caller)
  end

  self.first.upto(other.first) do |start|
    self.last.upto(other.last) do |stop|
      yield start..stop
    end
  end
end