Class: BindableBlock
- Inherits:
-
Proc
- Object
- Proc
- BindableBlock
show all
- Defined in:
- lib/bindable_block.rb,
lib/bindable_block/version.rb,
lib/bindable_block/arg_aligner.rb,
lib/bindable_block/bound_block.rb
Defined Under Namespace
Classes: ArgAligner, BoundBlock
Constant Summary
collapse
- VERSION =
"0.0.9"
Instance Method Summary
collapse
Constructor Details
#initialize(klass = BasicObject, &block) ⇒ BindableBlock
Returns a new instance of BindableBlock.
5
6
7
8
9
10
11
12
13
14
|
# File 'lib/bindable_block.rb', line 5
def initialize(klass=BasicObject, &block)
@klass = klass
@original_block = block
if curried_values = block.instance_variable_get(:@curried_values)
@original_block = curried_values[:original_block]
@curried_args = curried_values[:curried_args]
@uncurried_size = curried_values[:uncurried_size]
end
@instance_method = block_to_method klass, @original_block
end
|
Instance Method Details
#arity ⇒ Object
23
24
25
|
# File 'lib/bindable_block.rb', line 23
def arity
@original_block.arity
end
|
#bind(target) ⇒ Object
16
17
18
19
20
21
|
# File 'lib/bindable_block.rb', line 16
def bind(target)
bound = BoundBlock.new @original_block, target, &@instance_method.bind(target)
if @curried_args then bound.curry(@uncurried_size)[*@curried_args]
else bound
end
end
|
#curry(arity = nil) ⇒ Object
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
# File 'lib/bindable_block.rb', line 27
def curry(arity=nil)
arity ||= @instance_method.parameters.count { |type, _| type == :req }
original_block = @original_block bindable_blk_class = self.class
klass = @klass
proc_maker = lambda do |curried_args, uncurried_size|
curried = Proc.new do |*args, &block|
actual_args = curried_args + args
if uncurried_size <= actual_args.size
original_block.call(*actual_args, &block)
else
proc_maker.call actual_args, uncurried_size
end
end
curried.instance_variable_set :@curried_values, {
original_block: original_block,
curried_args: curried_args,
uncurried_size: arity,
}
bindable_blk_class.new klass, &curried
end
proc_maker.call [], arity
end
|