sorbet-runtime 0.6.13640 → 0.6.13645
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/types/_types.rb +1 -1
- data/lib/types/types/typed_hash.rb +27 -0
- data/lib/types/types/union.rb +18 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e60178283f5d03064093df6783548c58e6ea6f57b9b179dde7813d49deac5ecc
|
|
4
|
+
data.tar.gz: c23e8c62f59909036be48774a0986fb8487e6a5b06d5328ca79ac7e2946d8307
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f2df8e767af1c945a6b0b75b9cfef26b8c38a271fd1674f5b404f646a01df3df547ed399e6b10603a4cecc49764281aca10f7e31a7d69608a7ef9bf6292a63de
|
|
7
|
+
data.tar.gz: a000671a569f11bafddbf498a71b105b65dc314ef5a76b2605b213541f540580af1fd2c0037eec99982fe7455b346201d803c349913c4c78b2be43f88889bb6d
|
data/lib/types/_types.rb
CHANGED
|
@@ -331,7 +331,7 @@ module T
|
|
|
331
331
|
if keys.is_a?(T::Types::Untyped) && values.is_a?(T::Types::Untyped)
|
|
332
332
|
T::Types::TypedHash::Untyped::Private::INSTANCE
|
|
333
333
|
else
|
|
334
|
-
T::Types::TypedHash.
|
|
334
|
+
T::Types::TypedHash::Private::Pool.type_for_keys_and_values(keys, values)
|
|
335
335
|
end
|
|
336
336
|
end
|
|
337
337
|
end
|
|
@@ -45,6 +45,33 @@ module T::Types
|
|
|
45
45
|
Hash.new(...)
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
+
# Only public for `Private::Pool`, which holds each per-keys bucket weakly, so every pooled type keeps its own bucket alive.
|
|
49
|
+
def _retain_pool_bucket(bucket)
|
|
50
|
+
@pool_bucket = bucket
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
module Private
|
|
54
|
+
module Pool
|
|
55
|
+
@cache = ObjectSpace::WeakMap.new
|
|
56
|
+
|
|
57
|
+
def self.type_for_keys_and_values(keys, values)
|
|
58
|
+
by_values = @cache[keys]
|
|
59
|
+
if by_values.nil?
|
|
60
|
+
by_values = ObjectSpace::WeakMap.new
|
|
61
|
+
@cache[keys] = by_values
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
cached = by_values[values]
|
|
65
|
+
return cached if cached
|
|
66
|
+
|
|
67
|
+
type = TypedHash.new(keys: keys, values: values)
|
|
68
|
+
type._retain_pool_bucket(by_values)
|
|
69
|
+
by_values[values] = type
|
|
70
|
+
type
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
48
75
|
class Untyped < TypedHash
|
|
49
76
|
def initialize
|
|
50
77
|
# Use the INSTANCE constant directly (rather than `T.untyped`) so this
|
data/lib/types/types/union.rb
CHANGED
|
@@ -148,6 +148,16 @@ module T::Types
|
|
|
148
148
|
EMPTY_ARRAY = [].freeze
|
|
149
149
|
private_constant :EMPTY_ARRAY
|
|
150
150
|
|
|
151
|
+
@nilable_cache = ObjectSpace::WeakMap.new
|
|
152
|
+
|
|
153
|
+
# Memoizes `T.nilable(type)` for compound types, the way `Simple#to_nilable` does for simple ones.
|
|
154
|
+
def self.nilable_of(type)
|
|
155
|
+
cached = @nilable_cache[type]
|
|
156
|
+
return cached if cached
|
|
157
|
+
|
|
158
|
+
@nilable_cache[type] = Union.new([type, T::Utils::Nilable::NIL_TYPE])
|
|
159
|
+
end
|
|
160
|
+
|
|
151
161
|
# Try to use `to_nilable` on a type to get memoization, or failing that
|
|
152
162
|
# try to at least use SimplePairUnion to get faster init and typechecking.
|
|
153
163
|
#
|
|
@@ -164,7 +174,14 @@ module T::Types
|
|
|
164
174
|
if !types.empty?
|
|
165
175
|
# Slow path
|
|
166
176
|
return Union.new([type_a, type_b] + types)
|
|
167
|
-
elsif !type_a.is_a?(T::Types::Simple)
|
|
177
|
+
elsif !type_a.is_a?(T::Types::Simple)
|
|
178
|
+
if type_b.equal?(T::Utils::Nilable::NIL_TYPE)
|
|
179
|
+
return nilable_of(type_a)
|
|
180
|
+
else
|
|
181
|
+
# Slow path
|
|
182
|
+
return Union.new([type_a, type_b])
|
|
183
|
+
end
|
|
184
|
+
elsif !type_b.is_a?(T::Types::Simple)
|
|
168
185
|
# Slow path
|
|
169
186
|
return Union.new([type_a, type_b])
|
|
170
187
|
end
|