Skip to content

Commit cadb686

Browse files
committed
Speed up Set#flatten
Improved performance by ensuring that identical `Set` objects are processed only once.
1 parent 706f475 commit cadb686

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

lib/set.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -353,16 +353,19 @@ def to_set(klass = Set, *args, &block)
353353
klass.new(self, *args, &block)
354354
end
355355

356-
def flatten_merge(set, seen = Set.new) # :nodoc:
356+
def flatten_merge(set, seen = {}) # :nodoc:
357357
set.each { |e|
358358
if e.is_a?(Set)
359-
if seen.include?(e_id = e.object_id)
359+
case seen[e_id = e.object_id]
360+
when true
360361
raise ArgumentError, "tried to flatten recursive Set"
362+
when false
363+
next
361364
end
362365

363-
seen.add(e_id)
366+
seen[e_id] = true
364367
flatten_merge(e, seen)
365-
seen.delete(e_id)
368+
seen[e_id] = false
366369
else
367370
add(e)
368371
end

0 commit comments

Comments
 (0)