6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
# File 'lib/amenable.rb', line 6
def call(fn, *args, **kwargs, &block)
unless fn.is_a?(Method) || fn.is_a?(Proc)
raise ArgumentError, "expecting type Method or Proc, found: #{fn.class}"
end
rest = keyrest = false
params = []
keys = []
fn.parameters.each do |type, name|
case type
when :req, :opt
params << name
when :key, :keyreq
keys << name
when :rest
rest = true
when :keyrest
keyrest = true
end
end
args = args.slice(0, params.count) unless rest
if !keys.empty? || keyrest
kwargs = kwargs.slice(*keys) unless keyrest
fn.call(*args, **kwargs, &block)
else
fn.call(*args, &block)
end
end
|