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