Sha256: faa54d84549a9ca92b0e14d5ca6932eb70abcdea4cd500a4dea931a0ec5ed095

Contents?: true

Size: 1.06 KB

Versions: 3

Compression:

Stored size: 1.06 KB

Contents

require "metamorpher/visitable/visitor"

module Metamorpher
  module Rewriter
    module Substitution
      def substitute(substitution)
        accept SubstitutionVisitor.new(substitution)
      end
    end

    class SubstitutionVisitor < Visitable::Visitor
      attr_accessor :substitution

      def initialize(substitution)
        @substitution = substitution
      end

      def visit_variable(variable)
        substitution_for_variable(variable.name)
      end

      def visit_literal(literal)
        Terms::Literal.new(
          name: literal.name,
          children: literal.children.flat_map { |child| visit(child) }
        )
      end

      def visit_derived(derived)
        substitutes = derived.base.map { |v| substitution_for_variable(v) }
        derived.derivation.call(*substitutes)
      end

      private

      def substitution_for_variable(name)
        substitution.fetch(name) do
          fail SubstitutionError, "No substitution found for variable '#{name}'"
        end
      end
    end

    class SubstitutionError < ArgumentError; end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
metamorpher-0.2.0 lib/metamorpher/rewriter/substitution.rb
metamorpher-0.1.1 lib/metamorpher/rewriter/substitution.rb
metamorpher-0.1.0 lib/metamorpher/rewriter/substitution.rb