@@ -111,3 +111,64 @@ function recursive_mean{T<:AbstractArray}(matarr::Matrix{T},region=0)
111
111
return recursive_mean (matarr' ,1 )
112
112
end
113
113
end
114
+
115
+
116
+ # From Iterators.jl. Moved here since Iterators.jl is not precompile safe anymore.
117
+
118
+ # Concatenate the output of n iterators
119
+ immutable Chain{T<: Tuple }
120
+ xss:: T
121
+ end
122
+
123
+ # iteratorsize method defined at bottom because of how @generated functions work in 0.6 now
124
+
125
+ """
126
+ chain(xs...)
127
+
128
+ Iterate through any number of iterators in sequence.
129
+ ```jldoctest
130
+ julia> for i in chain(1:3, ['a', 'b', 'c'])
131
+ @show i
132
+ end
133
+ i = 1
134
+ i = 2
135
+ i = 3
136
+ i = 'a'
137
+ i = 'b'
138
+ i = 'c'
139
+ ```
140
+ """
141
+ chain (xss... ) = Chain (xss)
142
+
143
+ Base. length (it:: Chain{Tuple{}} ) = 0
144
+ Base. length (it:: Chain ) = sum (length, it. xss)
145
+
146
+ Base. eltype {T} (:: Type{Chain{T}} ) = typejoin ([eltype (t) for t in T. parameters]. .. )
147
+
148
+ function Base. start (it:: Chain )
149
+ i = 1
150
+ xs_state = nothing
151
+ while i <= length (it. xss)
152
+ xs_state = start (it. xss[i])
153
+ if ! done (it. xss[i], xs_state)
154
+ break
155
+ end
156
+ i += 1
157
+ end
158
+ return i, xs_state
159
+ end
160
+
161
+ function Base. next (it:: Chain , state)
162
+ i, xs_state = state
163
+ v, xs_state = next (it. xss[i], xs_state)
164
+ while done (it. xss[i], xs_state)
165
+ i += 1
166
+ if i > length (it. xss)
167
+ break
168
+ end
169
+ xs_state = start (it. xss[i])
170
+ end
171
+ return v, (i, xs_state)
172
+ end
173
+
174
+ Base. done (it:: Chain , state) = state[1 ] > length (it. xss)
0 commit comments