6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# File 'lib/structure_walker.rb', line 6
def invoke(proc)
walker = -> (steps, data) do
return if data.nil?
if steps.empty?
result = proc.call(data)
else
steps = steps.clone
step = steps.shift
key = step.first
data_type = step.last
result = case key
when :enum
if data_type == :hash
data.each { |_k,v| walker.call(steps, v) }
elsif data_type == :array
data.each { |v| walker.call(steps, v) }
end
when :key
walker.call(steps, data[data_type])
when :method
record = data.send(data_type)
walker.call(steps, record)
end
end
result
end
walker
end
|