summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKouhei Yanagita <[email protected]>2024-11-29 12:31:54 +0900
committerHiroshi SHIBATA <[email protected]>2024-12-02 08:28:44 +0900
commitf2334cf4b1fe3b903a17c46004e9dc9127397da7 (patch)
tree819e7b37f7dc3701199e4a5066a2b5f273ea67b0 /lib
parent96fac34797b3cf5d020cef8546cc37c6733c88f2 (diff)
[ruby/set] Speed up Set#flatten
Improved performance by ensuring that identical `Set` objects are processed only once. https://github.com/ruby/set/commit/cadb686e93
Diffstat (limited to 'lib')
-rw-r--r--lib/set.rb11
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/set.rb b/lib/set.rb
index 2aa2c06889..ecf89c5c16 100644
--- a/lib/set.rb
+++ b/lib/set.rb
@@ -353,16 +353,19 @@ class Set
klass.new(self, *args, &block)
end
- def flatten_merge(set, seen = Set.new) # :nodoc:
+ def flatten_merge(set, seen = {}) # :nodoc:
set.each { |e|
if e.is_a?(Set)
- if seen.include?(e_id = e.object_id)
+ case seen[e_id = e.object_id]
+ when true
raise ArgumentError, "tried to flatten recursive Set"
+ when false
+ next
end
- seen.add(e_id)
+ seen[e_id] = true
flatten_merge(e, seen)
- seen.delete(e_id)
+ seen[e_id] = false
else
add(e)
end