blob: 4d5fc1f49751069c43275b28b9b81f3e74132bcc (
plain)
1
2
3
4
5
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
# Author:: Daniel DeLeo (<dan@kallistec.com>)
# Copyright:: Copyright (c) 2009 Daniel DeLeo
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
class Chef
class ResourceCollection
class StepableIterator
def self.for_collection(new_collection)
instance = new(new_collection)
instance
end
attr_accessor :collection
attr_reader :position
def initialize(collection=[])
@position = 0
@paused = false
@collection = collection
end
def size
collection.size
end
def each(&block)
reset_iteration(block)
@iterator_type = :element
iterate
end
def each_index(&block)
reset_iteration(block)
@iterator_type = :index
iterate
end
def each_with_index(&block)
reset_iteration(block)
@iterator_type = :element_with_index
iterate
end
def paused?
@paused
end
def pause
@paused = true
end
def resume
@paused = false
iterate
end
def rewind
@position = 0
end
def skip_back(skips=1)
@position -= skips
end
def skip_forward(skips=1)
@position += skips
end
def step
return nil if @position == size
call_iterator_block
@position += 1
end
def iterate_on(iteration_type, &block)
@iterator_type = iteration_type
@iterator_block = block
end
private
def reset_iteration(iterator_block)
@iterator_block = iterator_block
@position = 0
@paused = false
end
def iterate
while @position < size && !paused?
step
end
collection
end
def call_iterator_block
case @iterator_type
when :element
@iterator_block.call(collection[@position])
when :index
@iterator_block.call(@position)
when :element_with_index
@iterator_block.call(collection[@position], @position)
else
raise "42error: someone forgot to set @iterator_type, wtf?"
end
end
end
end
end
|