class PatternProc::PatternProcCase
Attributes
proc_applied_level[R]
proc_arity[R]
Public Class Methods
new(args, previous_specificity = 0, proc_arity = 0, &block)
click to toggle source
# File lib/pattern-proc/pattern_proc_case.rb, line 7 def initialize(args, previous_specificity = 0, proc_arity = 0, &block) @expected_args = args @proc = block @proc_arity = proc_arity @previous_specificity = previous_specificity || 0 if !block.nil? && block.arity > 0 @proc_arity = block.arity end end
Public Instance Methods
arity()
click to toggle source
# File lib/pattern-proc/pattern_proc_case.rb, line 27 def arity expected_arity + proc_arity end
expected_arity()
click to toggle source
private ish
# File lib/pattern-proc/pattern_proc_case.rb, line 23 def expected_arity @expected_args.size || 0 end
make_subcase(args)
click to toggle source
# File lib/pattern-proc/pattern_proc_case.rb, line 35 def make_subcase(args) match_len = [args.size, @expected_args.size].min expected = @expected_args.take(match_len) actual = args.take(match_len) if expected == actual new_proc = to_proc.curry curry_count = args.size - @expected_args.size new_arity = proc_arity if curry_count > 0 send_args = args.drop(match_len).take(curry_count) new_proc = new_proc.call(*send_args) new_arity -= curry_count if new_arity == 0 return PatternProcCase.new([], specificity).returns(new_proc) elsif !(new_proc.is_a?(Proc)) raise "uh oh" end end PatternProcCase.new(@expected_args.drop(match_len), specificity, new_arity, &new_proc).returns(@return_value) else nil end end
returns(value)
click to toggle source
# File lib/pattern-proc/pattern_proc_case.rb, line 17 def returns(value) @return_value = value self end
specificity()
click to toggle source
# File lib/pattern-proc/pattern_proc_case.rb, line 31 def specificity expected_arity + @previous_specificity end
to_proc()
click to toggle source
# File lib/pattern-proc/pattern_proc_case.rb, line 59 def to_proc @proc || ->(*args) { @return_value } end