lib/lambda_driver/callable.rb in lambda_driver-1.2.0 vs lib/lambda_driver/callable.rb in lambda_driver-1.2.1

- old
+ new

@@ -1,94 +1,11 @@ +# -*- encoding : utf-8 -*- module LambdaDriver::Callable - def call(*args, &block) + def <(*args, &block) if block_given? self.to_proc.call(*args, &block) else self.to_proc.call(*args) end - end - - # Returns new lambda which composed self and given function. - # A composed proc called with args, executes `self.(g(*args)). - # - # f = lamdba{|x| x.to_s } - # g = lambda{|y| y.length } - # h = f compose g - # h.(:hoge) # => 4 - # - # This method is aliased as `<<`. - # - # f << g # => f.compose(g) - # - def compose(g) - lambda{|*args| self.to_proc.call(g.to_proc.call(*args)) } - end - - # g compose self - def >>(g) - g.to_proc << self - end - - # Returns partially applied function that has 2nd and more parameters - # fixed by given *args. - # - # f = lamdba{|x, y, z| [x, y, z]} - # h = f.with_args(:a, :b) - # h.(:c) # => [:c, :a, :b] - # - # This method is aliased as `*`. - # - # f * :foo # => f.with_args(:foo) - # - def with_args(*args) - lambda{|v| - self.to_proc.call(*([v] + args)) - } - end - - # Returns function whose parameter order spawed 1st for 2nd. - # A result of filped fuction is curried by Proc#curry. - # - # f = lamdba{|x, y, z| [x, y, z]} - # h = f.flip - # h.(:a).(:b).(:c) # => [:b, :a, :c] - # - # If arguments is var-args, pass explicitly arity to curring. - # - # p = Proc.new{|*args| args.inspect } - # p.flip(3).call(:a).(:b).(:c) # => "[:b, :a, :c]" - # p.flip(4).call(:a).(:b).(:c).(:d) # => "[:b, :a, :c, :d]" - # - # If arity is 0 or 1, flip returns itself. - # - # This method is aliased as `~@`. - # - # ~f # => f.filp - # - def flip(arity = nil) - f = self.to_proc - return self if (0..1).include?(f.arity) - return self if f.arity == -1 && arity.nil? - - curried = f.curry(arity) - lambda{|x| - lambda{|y| - g = curried[y] - (g.respond_to? :call) ? g[x] : g - } - } - end - - def curry(arity = nil) - self.to_proc.curry(arity) - end - - def self.included(klass) - klass.send(:alias_method, :+@, :to_proc) - klass.send(:alias_method, :<, :call) - klass.send(:alias_method, :<<, :compose) - klass.send(:alias_method, :*, :with_args) - klass.send(:alias_method, :~@, :flip) - klass.send(:alias_method, :%, :curry) end end