class Steep::AST::Types::Tuple

def ==(other)

def ==(other)
  other.is_a?(Tuple) &&
    other.types == types
end

def each_child(&block)

def each_child(&block)
  if block
    types.each(&block)
  else
    types.each
  end
end

def free_variables()

def free_variables()
  @fvs ||= each_child.with_object(Set[]) do |type, set| #$ Set[variable]
    set.merge(type.free_variables)
  end
end

def hash

def hash
  self.class.hash ^ types.hash
end

def initialize(types:, location: nil)

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

def level

def level
  [0] + level_of_children(types)
end

def subst(s)

def subst(s)
  self.class.new(location: location,
                 types: types.map {|ty| ty.subst(s) })
end

def to_s

def to_s
  "[#{types.join(", ")}]"
end

def with_location(new_location)

def with_location(new_location)
  self.class.new(types: types, location: new_location)
end