class Steep::AST::Builtin::Type

def class_type(constructor: nil)

def class_type(constructor: nil)
  Types::Name::Class.new(name: module_name, constructor: constructor)
end

def class_type?(type, constructor: NONE)

def class_type?(type, constructor: NONE)
  if type.is_a?(Types::Name::Class)
    unless constructor.equal?(NONE)
      type.name == module_name && type.name.constructor == constructor
    else
      type.name == module_name
    end
  else
    false
  end
end

def initialize(module_name, arity: 0)

def initialize(module_name, arity: 0)
  @module_name = Names::Module.parse(module_name)
  @arity = arity
end

def instance_type(*args)

def instance_type(*args)
  arity == args.size or raise "Mulformed 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 "Mulformed instance type: name=#{module_name}, args=#{args}"
      type.name == module_name && type.args == args
    else
      type.name == module_name && type.args.size == arity
    end
  else
    false
  end
end

def module_type

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

def module_type?(type)

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