module Spruz::PartialApplication

Public Class Methods

included(modul) click to toggle source

If this module is included into a Proc (or similar object), it tampers with its Proc#arity method.

Calls superclass method
# File lib/spruz/partial_application.rb, line 5
def self.included(modul)
  modul.module_eval do
    old_arity = instance_method(:arity)
    define_method(:arity) do
      @__arity__ or old_arity.bind(self).call
    end
  end
  super
end

Public Instance Methods

partial(*args) click to toggle source

Create a partial application of this Proc (or similar object) using args as the already applied arguments.

# File lib/spruz/partial_application.rb, line 17
def partial(*args)
  if args.empty?
    dup
  elsif args.size > arity
    raise ArgumentError, "wrong number of arguments (#{args.size} for #{arity})"
  else
    f = lambda { |*b| call(*(args + b)) }
    f.instance_variable_set :@__arity__, arity - args.size
    f
  end
end