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
|