module T

def self.arr?(t)

def self.arr?(t)
  if t.respond_to? :underlying_class
    return t.underlying_class == ::Array
  end
  false
end

def self.arr_of(t)

def self.arr_of(t)
  get_raw_type(t.type)
end

def self.get_raw_type(t)

def self.get_raw_type(t)
  if t.respond_to? :raw_type
    return t.raw_type
  elsif t.respond_to? :raw_a
    return T::Boolean if t.raw_a in [TrueClass, FalseClass]
  end
  t
end

def self.hash?(t)

def self.hash?(t)
  if t.respond_to? :underlying_class
    return t.underlying_class == ::Hash
  end
  false
end

def self.hash_of(t)

def self.hash_of(t)
  get_raw_type(t.values)
end

def self.nilable?(t)

def self.nilable?(t)
  t.respond_to? :unwrap_nilable
end

def self.nilable_of(t)

def self.nilable_of(t)
  if t.respond_to? :unwrap_nilable
    return simplify_type t.unwrap_nilable
  end
  nil
end

def self.simplifiable?(t)

def self.simplifiable?(t)
  return t.is_a? T::Types::Simple
end

def self.simplify_type(t)

def self.simplify_type(t)
  if t.is_a? T::Types::Simple
    return t.raw_type
  end
  t
end