From f2334cf4b1fe3b903a17c46004e9dc9127397da7 Mon Sep 17 00:00:00 2001 From: Kouhei Yanagita Date: Fri, 29 Nov 2024 12:31:54 +0900 Subject: [PATCH] [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 --- lib/set.rb | 11 +++++++---- 1 file 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