class SFRP::Poly::MatchExp

Constants

Case

Public Class Methods

new(left_exp, cases, id = nil) click to toggle source
# File lib/sfrp/poly/expression.rb, line 6
def initialize(left_exp, cases, id = nil)
  @left_exp = left_exp
  @cases = cases
  @id = id
end

Public Instance Methods

called_func_strs() click to toggle source
# File lib/sfrp/poly/expression.rb, line 29
def called_func_strs
  [@left_exp, *@cases.map(&:exp)].flat_map(&:called_func_strs)
end
clone() click to toggle source
# File lib/sfrp/poly/expression.rb, line 24
def clone
  cloned_cases = @cases.map { |c| Case.new(c.pattern.clone, c.exp.clone) }
  MatchExp.new(@left_exp.clone, cloned_cases, @id)
end
to_mono(monofier) click to toggle source
# File lib/sfrp/poly/expression.rb, line 33
def to_mono(monofier)
  raise UndeterminableTypeError.new(@id, @typing) unless @typing.mono?
  mono_type_str = monofier.use_type(@typing)
  M.match_e(mono_type_str, @left_exp.to_mono(monofier)) do |m|
    @cases.each do |c|
      m.case(c.pattern.to_mono(monofier)) { c.exp.to_mono(monofier) }
    end
  end
end
typing(set, var_env) click to toggle source
# File lib/sfrp/poly/expression.rb, line 12
def typing(set, var_env)
  raise if @typing
  left_exp_typing = @left_exp.typing(set, var_env)
  @typing = Typing.new do |t|
    @cases.each do |c|
      new_var_env = var_env.dup
      left_exp_typing.unify(c.pattern.typing(set, new_var_env))
      t.unify(c.exp.typing(set, new_var_env))
    end
  end
end