class Dentaku::AST::Case

def self.max_param_count

def self.max_param_count
  Float::INFINITY
end

def self.min_param_count

def self.min_param_count
  2
end

def accept(visitor)

def accept(visitor)
  visitor.visit_case(self)
end

def condition_dependencies(context = {})

def condition_dependencies(context = {})
  @conditions.flat_map { |condition| condition.dependencies(context) }
end

def dependencies(context = {})

def dependencies(context = {})
  # TODO: should short-circuit
  switch_dependencies(context) +
  condition_dependencies(context) +
  else_dependencies(context)
end

def else_dependencies(context = {})

def else_dependencies(context = {})
  @else ? @else.dependencies(context) : []
end

def initialize(*nodes)

def initialize(*nodes)
  @switch = nodes.shift
  unless @switch.is_a?(AST::CaseSwitchVariable)
    raise ParseError.for(:node_invalid), 'Case missing switch variable'
  end
  @conditions = nodes
  @else = nil
  @else = @conditions.pop if @conditions.last.is_a?(AST::CaseElse)
  @conditions.each do |condition|
    unless condition.is_a?(AST::CaseConditional)
      raise ParseError.for(:node_invalid), "#{condition} is not a CaseConditional"
    end
  end
end

def switch_dependencies(context = {})

def switch_dependencies(context = {})
  @switch.dependencies(context)
end

def value(context = {})

def value(context = {})
  switch_value = @switch.value(context)
  @conditions.each do |condition|
    if condition.when.value(context) == switch_value
      return condition.then.value(context)
    end
  end
  if @else
    return @else.value(context)
  else
    raise ArgumentError.for(:invalid_value), "No block matched the switch value '#{switch_value}'"
  end
end