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 |