Method: Map.breadth_first_each

Defined in:
lib/map.rb

.breadth_first_each(enumerable, accum = [], &block) ⇒ Object



1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
# File 'lib/map.rb', line 1095

def Map.breadth_first_each(enumerable, accum = [], &block)
  levels = []

  keys = Map.depth_first_keys(enumerable)

  keys.each do |key|
    key.size.times do |i|
      k = key.slice(0, i + 1)
      level = k.size - 1
      levels[level] ||= Array.new
      last = levels[level].last
      levels[level].push(k) unless last == k
    end
  end

  levels.each do |level|
    level.each do |key|
      val = enumerable.get(key)
      block ? block.call(key, val) : accum.push([key, val])
    end
  end

  block ? enumerable : accum
end