Project

General

Profile

Feature #6284 » 0002-proc.c-Implement-Method-for-Method-composition.patch

mudge (Paul Mucur), 12/30/2015 12:28 PM

View differences:

proc.c
return proc;
}
/*
* call-seq:
* meth * g -> a_proc
*
* Returns a proc that is the composition of this method and the given proc <i>g</i>.
* The returned proc takes a variable number of arguments, calls <i>g</i> with them
* then calls this method with the result.
*
* def f(x)
* x * 2
* end
*
* f = self.method(:f)
* g = proc {|x, y| x + y }
* h = f * g
* p h.call(1, 2) #=> 6
*/
static VALUE
rb_method_compose(VALUE self, VALUE g)
{
VALUE proc = method_to_proc(self);
return proc_compose(proc, g);
}
/*
* Document-class: LocalJumpError
*
......
rb_define_method(rb_cMethod, "clone", method_clone, 0);
rb_define_method(rb_cMethod, "call", rb_method_call, -1);
rb_define_method(rb_cMethod, "curry", rb_method_curry, -1);
rb_define_method(rb_cMethod, "*", rb_method_compose, 1);
rb_define_method(rb_cMethod, "[]", rb_method_call, -1);
rb_define_method(rb_cMethod, "arity", method_arity_m, 0);
rb_define_method(rb_cMethod, "inspect", method_inspect, 0);
test/ruby/test_method.rb
assert_equal('1', obj.foo(1))
assert_equal('1', obj.bar(1))
end
def test_compose_with_method
c = Class.new {
def f(x) x * 2 end
def g(x) x + 1 end
}
f = c.new.method(:f)
g = c.new.method(:g)
h = f * g
assert_equal(6, h.call(2))
end
def test_compose_with_proc
c = Class.new {
def f(x) x * 2 end
}
f = c.new.method(:f)
g = proc{|x| x + 1}
h = f * g
assert_equal(6, h.call(2))
end
def test_compose_with_nonproc_or_method
c = Class.new {
def f(x) x * 2 end
}
f = c.new.method(:f)
assert_raise(TypeError) {
f * 5
}
end
end
(2-2/3)