Module: SuperDiff::RecursionGuard
- Defined in:
- lib/super_diff/recursion_guard.rb
Constant Summary collapse
- RECURSION_GUARD_KEY =
"super_diff_recursion_guard_key".freeze
- PLACEHOLDER =
"∙∙∙".freeze
Class Method Summary collapse
- .already_seen_object_ids ⇒ Object
- .already_seen_objects ⇒ Object
- .guarding_recursion_of(*objects, &block) ⇒ Object
- .substituting_recursion_of(*objects) ⇒ Object
Class Method Details
.already_seen_object_ids ⇒ Object
43 44 45 |
# File 'lib/super_diff/recursion_guard.rb', line 43 def self.already_seen_object_ids Thread.current[RECURSION_GUARD_KEY] ||= Set.new end |
.already_seen_objects ⇒ Object
39 40 41 |
# File 'lib/super_diff/recursion_guard.rb', line 39 def self.already_seen_objects already_seen_object_ids.map { |object_id| ObjectSpace._id2ref(object_id) } end |
.guarding_recursion_of(*objects, &block) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/super_diff/recursion_guard.rb', line 6 def self.guarding_recursion_of(*objects, &block) already_seen_objects, first_seen_objects = objects.partition do |object| already_seen_object_ids.include?(object.object_id) end first_seen_objects.each do |object| already_seen_object_ids.add(object.object_id) end result = if block.arity > 0 block.call(already_seen_objects.any?) else block.call end first_seen_objects.each do |object| already_seen_object_ids.delete(object.object_id) end result end |
.substituting_recursion_of(*objects) ⇒ Object
29 30 31 32 33 34 35 36 37 |
# File 'lib/super_diff/recursion_guard.rb', line 29 def self.substituting_recursion_of(*objects) guarding_recursion_of(*objects) do |already_seen| if already_seen PLACEHOLDER else yield end end end |