Module: LambdaDriver::Flipable

Included in:
Method, Proc, Symbol
Defined in:
lib/lambda_driver/flipable.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(klass) ⇒ Object



36
37
38
# File 'lib/lambda_driver/flipable.rb', line 36

def self.included(klass)
  klass.send(:alias_method, :~@, :flip)
end

Instance Method Details

#flip(arity = nil) ⇒ Object

Returns function whose parameter order spawed 1st for 2nd. A result of filped fuction is curried by Proc#curry.

f = lambda{|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


22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/lambda_driver/flipable.rb', line 22

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