Module: Tins::HashBFS

Extended by:
ThreadLocal
Defined in:
lib/tins/hash_bfs.rb

Instance Method Summary collapse

Methods included from ThreadLocal

instance_thread_local, thread_local

Instance Method Details

#bfs(visit_internal: false) {|index, value| ... } ⇒ self

The bfs method performs a breadth-first search on the object’s structure, visiting all elements and yielding their indices and values to the block.

Examples:

bfs { |index, value| … } # performs a breadth-first search on the object’s structure

Parameters:

  • visit_internal (true, false) (defaults to: false)

    whether to visit internal hashes or arrays

Yields:

  • (index, value)

    yields each element’s index and value to the block

Returns:

  • (self)

    returns the receiver

Raises:

  • (ArgumentError)

    if no &block argument was provided



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/tins/hash_bfs.rb', line 20

def bfs(visit_internal: false, &block)
  block or raise ArgumentError, 'require &block argument'
  self.seen = {}
  queue     = []
  queue.push([ nil, self ])
  while (index, object = queue.shift)
    case
    when seen[object.__id__]
      next
    when Hash === object
      seen[object.__id__] = true
      object.each do |k, v|
        queue.push([ k, convert_to_hash_or_ary(v) ])
      end
      visit_internal or next
    when Array === object
      seen[object.__id__] = true
      object.each_with_index do |v, i|
        queue.push([ i, convert_to_hash_or_ary(v) ])
      end
      visit_internal or next
    end
    block.(index, object)
  end
  self
ensure
  self.seen = nil
end

#convert_to_hash_or_ary(object) ⇒ Hash, ...

Converts the given object into a hash or array if possible

Parameters:

  • object (Object)

    The object to convert

Returns:

  • (Hash, Array, Object)

    The converted object or itself if not convertible



54
55
56
57
58
59
60
61
62
63
# File 'lib/tins/hash_bfs.rb', line 54

def convert_to_hash_or_ary(object)
  case
  when object.respond_to?(:to_hash)
    object.to_hash
  when object.respond_to?(:to_ary)
    object.to_ary
  else
    object
  end
end