···1010 def inspect = "_Hash(#{@key_type.inspect}, #{@value_type.inspect})"
11111212 def ===(value)
1313- Hash === value && value.each do |k, v|
1313+ return false unless Hash === value
1414+1515+ value.each do |k, v|
1416 return false unless @key_type === k && @value_type === v
1517 end
1818+1919+ true
1620 end
1721end
+7-1
lib/literal/types/set_type.rb
···99 def inspect = "_Set(#{@type.inspect})"
10101111 def ===(value)
1212- Set === value && value.all?(@type)
1212+ return false unless Set === value
1313+1414+ value.each do |v|
1515+ return false unless @type === v
1616+ end
1717+1818+ true
1319 end
1420end
+10-1
lib/literal/types/tuple_type.rb
···1111 def inspect = "_Tuple(#{@types.map(&:inspect).join(', ')})"
12121313 def ===(value)
1414- Array === value && value.size == @types.size && @types.each_with_index.all? { |t, i| t === value[i] }
1414+ return false unless Array === value
1515+ return false unless value.size == @types.size
1616+1717+ i, len = 0, @types.size
1818+ while i < len
1919+ return false unless @types[i] === value[i]
2020+ i += 1
2121+ end
2222+2323+ true
1524 end
1625end
+7-2
lib/literal/types/union_type.rb
···66 def initialize(*types)
77 raise Literal::ArgumentError.new("_Union type must have at least one type.") if types.size < 1
8899- @types = Set[]
99+ @types = []
1010 load_types(types)
1111+ @types.uniq!
1112 @types.freeze
1213 end
13141415 def inspect = "_Union(#{@types.inspect})"
15161617 def ===(value)
1717- @types.any? { |type| type === value }
1818+ i, len = 0, @types.size
1919+ while i < len
2020+ return true if @types[i] === value
2121+ i += 1
2222+ end
1823 end
19242025 def each(&)