Unverified Commit 2a9ccf24 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto Committed by GitHub

Merge pull request #4211 from dearblue/proc-composition

Add proc composition feature (CRuby-2.6 compatible)
parents acb1fdc7 fc20d018
...@@ -17,4 +17,12 @@ class Method ...@@ -17,4 +17,12 @@ class Method
def name def name
@name @name
end end
def <<(other)
->(*args, &block) { call(other.call(*args, &block)) }
end
def >>(other)
->(*args, &block) { other.call(call(*args, &block)) }
end
end end
...@@ -371,6 +371,25 @@ assert "Method#initialize_copy" do ...@@ -371,6 +371,25 @@ assert "Method#initialize_copy" do
assert_equal(m1, m2) assert_equal(m1, m2)
end end
assert "Method#<< and Method#>>" do
obj = Object.new
class << obj
def mul2(n); n * 2; end
def add3(n); n + 3; end
end
f = obj.method(:mul2)
g = obj.method(:add3)
m1 = f << g
assert_kind_of Proc, m1
assert_equal 16, m1.call(5)
m2 = f >> g
assert_kind_of Proc, m2
assert_equal 13, m2.call(5)
end
assert 'UnboundMethod#arity' do assert 'UnboundMethod#arity' do
c = Class.new { c = Class.new {
def foo(a, b) def foo(a, b)
......
...@@ -39,4 +39,12 @@ class Proc ...@@ -39,4 +39,12 @@ class Proc
make_curry.call make_curry.call
end end
def <<(other)
->(*args, &block) { call(other.call(*args, &block)) }
end
def >>(other)
->(*args, &block) { other.call(call(*args, &block)) }
end
end end
...@@ -77,6 +77,19 @@ assert('Kernel#proc') do ...@@ -77,6 +77,19 @@ assert('Kernel#proc') do
end end
end end
assert "Proc#<< and Proc#>>" do
add3 = ->(n) { n + 3 }
mul2 = ->(n) { n * 2 }
f1 = mul2 << add3
assert_kind_of Proc, f1
assert_equal 16, f1.call(5)
f2 = mul2 >> add3
assert_kind_of Proc, f2
assert_equal 13, f2.call(5)
end
assert('mrb_proc_new_cfunc_with_env') do assert('mrb_proc_new_cfunc_with_env') do
ProcExtTest.mrb_proc_new_cfunc_with_env(:test) ProcExtTest.mrb_proc_new_cfunc_with_env(:test)
ProcExtTest.mrb_proc_new_cfunc_with_env(:mruby) ProcExtTest.mrb_proc_new_cfunc_with_env(:mruby)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment