module Tins::HashBFS

Public Instance Methods

bfs(include_nodes: false, &block) click to toggle source
# File lib/tins/hash_bfs.rb, line 9
def bfs(include_nodes: 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
      include_nodes 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
      include_nodes or next
    end
    block.(index, object)
  end
  self
ensure
  self.seen = nil
end
convert_to_hash_or_ary(v) click to toggle source
# File lib/tins/hash_bfs.rb, line 38
def convert_to_hash_or_ary(v)
  case
  when v.respond_to?(:to_hash)
    v = v.to_hash
  when v.respond_to?(:to_ary)
    v = v.to_ary
  else
    v
  end
end