Sha256: 5f4c2177abd91b43fe2be187a6154bbb0d3d963f55e4c994c0c3dd43a5f1d038

Contents?: true

Size: 1.69 KB

Versions: 1

Compression:

Stored size: 1.69 KB

Contents

module Pione::Model
  # CallRule represents the application of a rule.
  # @example
  #   # simple rule calling:
  #   rule r1
  #   #=> CallRule.new(RuleExpr.new('r1'))
  # @example
  #   # with absolute path:
  #   rule /abc:a
  #   #=> CallRule.new(RuleExpr.new('/abc:a'))
  # @example
  #   # with variable:
  #   rule $X
  #   #=> CallRule.new(Variable.new('X'))
  class CallRule < BasicModel
    attr_reader :expr

    # Creates a callee rule.
    # @param [BasicModel] expr
    #   callee rule
    def initialize(expr)
      @expr = expr
      super()
    end

    # Returns a rule path string with expanding variables.
    # @return [String]
    #   rule path(package name and rule name)
    def rule_path
      if @expr.include_variable?
        raise UnboundVariableError.new(@expr)
      end
      @expr.rule_path
    end

    # Returns true if the expression has variables.
    # @return [Boolean]
    #   true if the expression has variables
    def include_variable?
      @expr.include_variable?
    end

    # Evaluates the expression.
    # @param [VariableTable] vtable
    #   variable table for evaluation
    # @return [BasicModel]
    #   evaluation result
    def eval(vtable)
      self.class.new(@expr.eval(vtable))
    end

    # Return a set of call-rules that the rule expression are expanded.
    #
    # @return [Set<CallRule>]
    #   a set of call-rules
    def to_set
      @expr.to_set.map do |expr|
        self.class.new(expr)
      end
    end

    # @api private
    def textize
      "call_rule(%s)" % [@expr.textize]
    end

    # @api private
    def ==(other)
      @expr == other.expr
    end

    alias :eql? :==

    # @api private
    def hash
      @expr.hash
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pione-0.1.2 lib/pione/model/call-rule.rb