@@ -21,18 +21,43 @@ enumerate(itr) = Enumerate(itr)
2121
2222length (e:: Enumerate ) = length (e. itr)
2323size (e:: Enumerate ) = size (e. itr)
24- start (e:: Enumerate ) = (1 , start (e. itr))
25- function next (e:: Enumerate , state)
24+ @inline start (e:: Enumerate ) = (1 , start (e. itr))
25+ @inline function next (e:: Enumerate , state)
2626 n = next (e. itr,state[2 ])
2727 (state[1 ],n[1 ]), (state[1 ]+ 1 ,n[2 ])
2828end
29- done (e:: Enumerate , state) = done (e. itr, state[2 ])
29+ @inline done (e:: Enumerate , state) = done (e. itr, state[2 ])
3030
3131eltype {I} (:: Type{Enumerate{I}} ) = Tuple{Int, eltype (I)}
3232
3333iteratorsize {I} (:: Type{Enumerate{I}} ) = iteratorsize (I)
3434iteratoreltype {I} (:: Type{Enumerate{I}} ) = iteratoreltype (I)
3535
36+ # visit
37+ # visit is like enumerate, except rather than counting entries it
38+ # returns the index associated with each entry
39+
40+ immutable Visit{I,A<: AbstractArray }
41+ data:: A
42+ itr:: I
43+ end
44+ visit (A:: AbstractArray ) = Visit (A, eachindex (A))
45+
46+ Base. length (v:: Visit ) = length (v. itr)
47+ Base. size (v:: Visit ) = size (v. itr)
48+ @inline Base. start (v:: Visit ) = start (v. itr)
49+ @inline function Base. next (v:: Visit , state)
50+ indx, n = next (v. itr, state)
51+ @inbounds item = v. data[indx]
52+ (indx, item), n
53+ end
54+ @inline Base. done (v:: Visit , state) = done (v. itr, state)
55+
56+ Base. eltype {I,A} (:: Type{Visit{I,A}} ) = Tuple{eltype (I), eltype (A)}
57+
58+ Base. iteratorsize {I} (:: Type{Visit{I}} ) = iteratorsize (I)
59+ Base. iteratoreltype {I} (:: Type{Visit{I}} ) = iteratoreltype (I)
60+
3661# zip
3762
3863abstract AbstractZipIterator
0 commit comments