Sha256: d2b6d4f0ab681234df7cb39ce1e4bebbf72fcc7a55547e6cf88a74a29c1569b0

Contents?: true

Size: 1.34 KB

Versions: 4

Compression:

Stored size: 1.34 KB

Contents

require_relative './case/case_conditional'
require_relative './case/case_when'
require_relative './case/case_then'
require_relative './case/case_switch_variable'
require_relative './case/case_else'

module Dentaku
  module AST
    class Case < Node
      def initialize(*nodes)
        @switch = nodes.shift

        unless @switch.is_a?(AST::CaseSwitchVariable)
          raise 'Case missing switch variable'
        end

        @conditions = nodes

        @else = @conditions.pop if @conditions.last.is_a?(AST::CaseElse)

        @conditions.each do |condition|
          unless condition.is_a?(AST::CaseConditional)
            raise "#{condition} is not a CaseConditional"
          end
        end
      end

      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 "No block matched the switch value '#{switch_value}'"
        end
      end

      def dependencies(context={})
        # TODO: should short-circuit
        @switch.dependencies(context) +
          @conditions.flat_map do |condition|
            condition.dependencies(context)
          end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
dentaku-2.0.9 lib/dentaku/ast/case.rb
dentaku-2.0.8 lib/dentaku/ast/case.rb
dentaku-2.0.7 lib/dentaku/ast/case.rb
dentaku-2.0.6 lib/dentaku/ast/case.rb