| Class | Proc |
| In: |
lib/core/facets/proc/to_method.rb
lib/core/facets/proc/compose.rb lib/core/facets/proc/bind.rb lib/core/facets/proc/update.rb lib/core/facets/proc/curry.rb |
| Parent: | Object |
| call | -> | update |
|
Use a Proc as an observable.
CREDIT: Tim Pease |
||
Operator for Proc#compose and Integer#times_collect/of.
a = lambda { |x| x + 4 }
b = lambda { |y| y / 2 }
(a * b).call(4) #=> 6
(b * a).call(4) #=> 4
CREDIT: Dave
# File lib/core/facets/proc/compose.rb, line 29
29: def *(x)
30: if Integer===x
31: # collect times
32: c = []
33: x.times{|i| c << call(i)}
34: c
35: else
36: # compose procs
37: lambda{|*a| self[x[*a]]}
38: end
39: end
Bind a Proc to an object returning a Method.
NOTE: This version comes from Rails. The old Facets
version used thread.rb, but I no longer think
the implementaiton is thread critical. Please
make a bug report if this proves wrong.
# File lib/core/facets/proc/bind.rb, line 10
10: def bind(object)
11: block, time = self, Time.now
12: (class << object; self; end).class_eval do
13: method_name = "__bind_#{time.to_i}_#{time.usec}"
14: define_method(method_name, &block)
15: method = instance_method(method_name)
16: remove_method(method_name)
17: method
18: end.bind(object)
19: end
Returns a new proc that is the functional composition of two procs, in order.
a = lambda { |x| x + 4 }
b = lambda { |y| y / 2 }
a.compose(b).call(4) #=> 6
b.compose(a).call(4) #=> 4
CREDIT: Dave
# File lib/core/facets/proc/compose.rb, line 14
14: def compose(g)
15: raise ArgumentError, "arity count mismatch" unless arity == g.arity
16: lambda{ |*a| self[ *g[*a] ] }
17: end
Curry Proc object into new Proc object.
TODO: Utilize Ruby 1.9‘s curry method.
# File lib/core/facets/proc/curry.rb, line 7
7: def curry(*args)
8: if args.empty?
9: idx = (0...arity).to_a
10: else
11: raise ArgumentError, "argument count is greater than prok.arity (#{args.size} > #{arity})" if args.size > arity
12: raise ArgumentError, "arguments must be unique indexes" if args.uniq != args
13: raise ArgumentError, "arguments must be indexes" if args.any?{ |a| !Fixnum===a }
14: idx = (0...arity).to_a
15: idx = args + (idx - args)
16: end
17:
18: pro = self
19: rec = ''
20: idx.each do |i|
21: rec << "proc { |a#{i}| "
22: end
23: rec << "pro["
24: rec << (0...arity).to_a.collect{|i| "a#{i}"}.join(',')
25: rec << "]"
26: rec << "}" * arity
27:
28: instance_eval rec
29: end
Convert Proc to method.
plusproc = lambda { |x| x + 1 }
plusproc.to_method(self, 'foo')
X.new.foo(1) #=> 2
# File lib/core/facets/proc/to_method.rb, line 11
11: def to_method(object, name=nil)
12: #object = object || eval("self", self)
13: block, time = self, Time.now
14: method_name = name || "__bind_#{time.to_i}_#{time.usec}"
15: begin
16: (class << object; self; end).class_eval do
17: define_method(method_name, &block)
18: method = instance_method(method_name)
19: remove_method(method_name) unless name
20: method
21: end.bind(object)
22: rescue TypeError
23: object.class.class_eval do
24: define_method(method_name, &block)
25: method = instance_method(method_name)
26: remove_method(method_name) unless name
27: method
28: end.bind(object)
29: end
30: end