Class: IceNine::RecursionGuard::ObjectSet

Inherits:
IceNine::RecursionGuard show all
Defined in:
lib/ice_nine/support/recursion_guard.rb

Overview

Protects against infinite recursion by never yielding with the same object more than once.

Instance Method Summary collapse

Constructor Details

#initializeundefined

Initialize a recursion guard



17
18
19
# File 'lib/ice_nine/support/recursion_guard.rb', line 17

def initialize
  @object_ids = {}
end

Instance Method Details

#guard(object) ⇒ Object

Guard against recursively calling a block with the same object

Examples:

recursion_guard = IceNine::RecursionGuard::ObjectSet.new
recursion_guard.guard(object) do
  logic_which_may_be_recursively_called_with_object(recursion_guard)
end

Parameters:

  • object (Object)

Returns:

  • (Object)


32
33
34
35
36
37
# File 'lib/ice_nine/support/recursion_guard.rb', line 32

def guard(object)
  caller_object_id = object.__id__
  return object if @object_ids.key?(caller_object_id)
  @object_ids[caller_object_id] = nil
  yield
end