module T::Utils::Private

def self.coerce_and_check_module_types(val, check_val, check_module_type)

def self.coerce_and_check_module_types(val, check_val, check_module_type)
  if val.is_a?(T::Types::Base)
    if val.is_a?(T::Private::Types::TypeAlias)
      val.aliased_type
    else
      val
    end
  elsif val.is_a?(Module)
    if check_module_type && check_val.is_a?(val)
      nil
    else
      T::Types::Simple::Private::Pool.type_for_module(val)
    end
  elsif val.is_a?(::Array)
    T::Types::FixedArray.new(val)
  elsif val.is_a?(::Hash)
    T::Types::FixedHash.new(val)
  elsif val.is_a?(T::Private::Methods::DeclBuilder)
    T::Private::Methods.finalize_proc(val.decl)
  elsif val.is_a?(::T::Enum)
    T::Types::TEnum.new(val)
  elsif val.is_a?(::String)
    raise "Invalid String literal for type constraint. Must be an #{T::Types::Base}, a " \
          "class/module, or an array. Got a String with value `#{val}`."
  else
    raise "Invalid value for type constraint. Must be an #{T::Types::Base}, a " \
          "class/module, or an array. Got a `#{val.class}`."
  end
end