summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-rational/mrblib/rational.rb
blob: 457c0488a6fdf9603e1ea8157ef4a4771b02a781 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Rational < Numeric
  def initialize(numerator = 0, denominator = 1)
    @numerator = numerator
    @denominator = denominator
  end

  attr_reader :numerator, :denominator
end

def Rational(numerator = 0, denominator = 1)
  Rational.new(numerator, denominator)
end

module ForwardOperatorToRational
  def __forward_operator_to_rational(op, &b)
    original_operator_name = "__original_operator_#{op}_rational"
    alias_method original_operator_name, op
    define_method op do |rhs|
      if rhs.is_a? Rational
        Rational.new(self).send(op, rhs)
      else
        send(original_operator_name, rhs)
      end
    end
  end

  def __forward_operators_to_rational
    __forward_operator_to_rational :+
    __forward_operator_to_rational :-
    __forward_operator_to_rational :*
    __forward_operator_to_rational :/

    singleton_class.undef_method :__forward_operator_to_rational
    singleton_class.undef_method :__forward_operators_to_rational
  end
end

class Fixnum
  extend ForwardOperatorToRational
  __forward_operators_to_rational
end

class Float
  extend ForwardOperatorToRational
  __forward_operators_to_rational
end