class Steep::AST::Builtin::Type

def initialize(module_name, arity: 0)

def initialize(module_name, arity: 0)
  @module_name = TypeName(module_name)
  @arity = arity
end

def instance_type(*args, fill_untyped: false)

def instance_type(*args, fill_untyped: false)
  if fill_untyped
    (arity - args.size).times do
      args << Builtin.any_type
    end
  end
  arity == args.size or raise "Malformed instance type: name=#{module_name}, args=#{args}"
  Types::Name::Instance.new(name: module_name, args: args)
end

def instance_type?(type, args: nil)

def instance_type?(type, args: nil)
  if type.is_a?(Types::Name::Instance)
    if args
      arity == args.size or raise "Malformed instance type: name=#{module_name}, args=#{args}"
      if type.name == module_name && type.args == args
        type
      end
    else
      if type.name == module_name && type.args.size == arity
        type
      end
    end
  end
end

def module_type

def module_type
  Types::Name::Singleton.new(name: module_name)
end

def module_type?(type)

def module_type?(type)
  if type.is_a?(Types::Name::Singleton)
    if type.name == module_name
      type
    end
  end
end