Sha256: 2bf64056505a8fe686564bf2d2d33eb48f8b20a5c64ad587a5930da89f2737fa

Contents?: true

Size: 1.35 KB

Versions: 2

Compression:

Stored size: 1.35 KB

Contents

#!/usr/bin/env ruby
# coding: utf-8
# Copyright muflax <mail@muflax.com>, 2011
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>

class Range
  def +(other)
    pair_or_num :+, other
  end

  def -(other)
    pair_or_num :-, other
  end

  def *(other)
    pair_or_num :*, other
  end

  def /(other)
    pair_or_num :/, other.to_f
  end

  def **(other)
    pair_or_num :**, other
  end

  def %(other)
    pair_or_num :%, other
  end
  
  def to_f
    (self.begin.to_f..self.end.to_f)
  end

  def to_i
    (self.begin.round..self.end.round)
  end

  def round places=0
    (self.begin.round(places)..self.end.round(places))
  end
  
  def average
    (self.begin + self.end) / 2.0
  end

  def coerce(other)
    if other.is_a? Range
      return other, self
    elsif other.is_a? Numeric
      return (other..other), self
    else
      super
    end
  end

  private
  
  def pair_or_num operator, other
    if other.is_a? Range
      calc_pairs operator, other
    elsif other.is_a? Numeric
      calc_pairs operator, (other..other)
    else
      raise NoMethodError
    end
  end
  
  def calc_pairs operator, other
    parts_x = [self.begin, self.end]
    parts_y = [other.begin, other.end]
    
    results = []
    parts_x.each do |x|
      parts_y.each do |y|
        results << x.send(operator, y)
      end
    end
    
    (results.min..results.max)
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
range_math-0.7.1 lib/range_math.rb
range_math-0.7.0 lib/range_math.rb