diff options
author | Kouhei Yanagita <[email protected]> | 2024-11-29 12:31:54 +0900 |
---|---|---|
committer | Hiroshi SHIBATA <[email protected]> | 2024-12-02 08:28:44 +0900 |
commit | f2334cf4b1fe3b903a17c46004e9dc9127397da7 (patch) | |
tree | 819e7b37f7dc3701199e4a5066a2b5f273ea67b0 /lib | |
parent | 96fac34797b3cf5d020cef8546cc37c6733c88f2 (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.rb | 11 |
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 |