summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-complex
diff options
context:
space:
mode:
authorUkrainskiy Sergey <[email protected]>2018-08-09 17:09:02 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-05-15 16:57:21 +0900
commit8808219e6d51673e6fa582819703e6e5912439b0 (patch)
tree7ad830fc1ea3da35d81fe853cd44023790131895 /mrbgems/mruby-complex
parent7f1f499b2277c4636824b7f3e9b301576aaddba5 (diff)
downloadmruby-8808219e6d51673e6fa582819703e6e5912439b0.tar.gz
mruby-8808219e6d51673e6fa582819703e6e5912439b0.zip
Initial suffix support
Diffstat (limited to 'mrbgems/mruby-complex')
-rw-r--r--mrbgems/mruby-complex/mrbgem.rake5
-rw-r--r--mrbgems/mruby-complex/mrblib/complex.rb95
-rw-r--r--mrbgems/mruby-complex/test/complex.rb3
3 files changed, 103 insertions, 0 deletions
diff --git a/mrbgems/mruby-complex/mrbgem.rake b/mrbgems/mruby-complex/mrbgem.rake
new file mode 100644
index 000000000..f8f04d0b8
--- /dev/null
+++ b/mrbgems/mruby-complex/mrbgem.rake
@@ -0,0 +1,5 @@
+MRuby::Gem::Specification.new('mruby-complex') do |spec|
+ spec.license = 'MIT'
+ spec.author = 'mruby developers'
+ spec.summary = 'Complex class'
+end
diff --git a/mrbgems/mruby-complex/mrblib/complex.rb b/mrbgems/mruby-complex/mrblib/complex.rb
new file mode 100644
index 000000000..0815c9a71
--- /dev/null
+++ b/mrbgems/mruby-complex/mrblib/complex.rb
@@ -0,0 +1,95 @@
+class Complex < Numeric
+ def initialize(real = 0, imaginary = 0)
+ @real = real
+ @imaginary = imaginary
+ end
+
+ def inspect
+ "(#{to_s})"
+ end
+
+ def to_s
+ "#{real}#{'+'}#{imaginary}i"
+ end
+
+ def +@
+ Complex.new(real, imaginary)
+ end
+
+ def -@
+ Complex.new(-real, -imaginary)
+ end
+
+ def +(rhs)
+ if rhs.is_a? Complex
+ Complex.new(real + rhs.real, imaginary + rhs.imaginary)
+ elsif rhs.is_a? Numeric
+ Complex.new(real + rhs, imaginary)
+ end
+ end
+
+ def -(rhs)
+ if rhs.is_a? Complex
+ Complex.new(real - rhs.real, imaginary - rhs.imaginary)
+ elsif rhs.is_a? Numeric
+ Complex.new(real - rhs, imaginary)
+ end
+ end
+
+ def *(rhs)
+ if rhs.is_a? Complex
+ Complex.new(real * rhs.real - imaginary * rhs.imaginary, real * rhs.imaginary + rhs.real * imaginary)
+ elsif rhs.is_a? Numeric
+ Complex.new(real * rhs, imaginary * rhs)
+ end
+ end
+
+ def /(rhs)
+ if rhs.is_a? Complex
+ div = rhs.real * rhs.real + rhs.imaginary * rhs.imaginary
+ Complex.new((real * rhs.real + imaginary * rhs.imaginary) / div, (rhs.real * imaginary - real * rhs.imaginary) / div)
+ elsif rhs.is_a? Numeric
+ Complex.new(real / rhs, imaginary / rhs)
+ end
+ end
+
+ attr_reader :real, :imaginary
+end
+
+def Complex(real = 0, imaginary = 0)
+ Complex.new(real, imaginary)
+end
+
+module ForwardOperatorToComplex
+ def __forward_operator_to_complex(op, &b)
+ original_operator_name = "__original_operator_#{op}_complex"
+ alias_method original_operator_name, op
+ define_method op do |rhs|
+ if rhs.is_a? Complex
+ Complex.new(self).send(op, rhs)
+ else
+ send(original_operator_name, rhs)
+ end
+ end
+ end
+
+ def __forward_operators_to_complex
+ __forward_operator_to_complex :+
+ __forward_operator_to_complex :-
+ __forward_operator_to_complex :*
+ __forward_operator_to_complex :/
+
+ singleton_class.undef_method :__forward_operator_to_complex
+ singleton_class.undef_method :__forward_operators_to_complex
+ end
+end
+
+class Fixnum
+ extend ForwardOperatorToComplex
+ __forward_operators_to_complex
+end
+
+class Float
+ extend ForwardOperatorToComplex
+ __forward_operators_to_complex
+end \ No newline at end of file
diff --git a/mrbgems/mruby-complex/test/complex.rb b/mrbgems/mruby-complex/test/complex.rb
new file mode 100644
index 000000000..890dd4ff1
--- /dev/null
+++ b/mrbgems/mruby-complex/test/complex.rb
@@ -0,0 +1,3 @@
+assert 'Complex' do
+ assert_equal Complex, 0i.class
+end \ No newline at end of file