Module: T::Types::Simple::Private::Pool

Defined in:
lib/types/types/simple.rb

Constant Summary collapse

CACHE_FROZEN_OBJECTS =
begin
  ObjectSpace::WeakMap.new[1] = 1
  true # Ruby 2.7 and newer
                       rescue ArgumentError # Ruby 2.6 and older
                         false
end

Class Method Summary collapse

Class Method Details

.type_for_module(mod) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/types/types/simple.rb', line 72

def self.type_for_module(mod)
  cached = @cache[mod]
  return cached if cached

  type = if mod == ::Array
    T::Array[T.untyped]
  elsif mod == ::Hash
    T::Hash[T.untyped, T.untyped]
  elsif mod == ::Enumerable
    T::Enumerable[T.untyped]
  elsif mod == ::Enumerator
    T::Enumerator[T.untyped]
  elsif mod == ::Range
    T::Range[T.untyped]
  elsif !Object.autoload?(:Set) && Object.const_defined?(:Set) && mod == ::Set
    T::Set[T.untyped]
  else
    Simple.new(mod)
  end

  # Unfortunately, we still need to check if the module is frozen,
  # since on 2.6 and older WeakMap adds a finalizer to the key that is added
  # to the map, so that it can clear the map entry when the key is
  # garbage collected.
  # For a frozen object, though, adding a finalizer is not a valid
  # operation, so this still raises if `mod` is frozen.
  if CACHE_FROZEN_OBJECTS || (!mod.frozen? && !type.frozen?)
    @cache[mod] = type
  end
  type
end