class Steep::AST::Types::Var

def self.fresh(name, location: nil)

def self.fresh(name, location: nil)
  new(name: fresh_name(name), location: location)
end

def self.fresh_name(name)

def self.fresh_name(name)
  @mutex ||= Thread::Mutex.new
  @mutex.synchronize do
    @max ||= 0
    @max += 1
    :"#{name}(#{@max})"
  end
end

def ==(other)

def ==(other)
  other.is_a?(Var) &&
    other.name == name
end

def free_variables()

def free_variables()
  @fvs ||= Set.new([name])
end

def hash

def hash
  self.class.hash ^ name.hash
end

def initialize(name:, location: nil)

def initialize(name:, location: nil)
  @name = name
  @location = location
end

def level

def level
  [0]
end

def subst(s)

def subst(s)
  if s.key?(name)
    s[name]
  else
    self
  end
end

def to_s

def to_s
  name.to_s
end

def update(name: self.name, location: self.location)

def update(name: self.name, location: self.location)
  self.class.new(
    name: name,
    location: location
  )
end

def with_location(new_location)

def with_location(new_location)
  update(location: new_location)
end