@@ -22,6 +22,7 @@ pub trait IteratorUtil<A> {
22
22
// FIXME: #5898: should be called map
23
23
fn transform < ' r , B > ( self , f : & ' r fn ( A ) -> B ) -> MapIterator < ' r , A , B , Self > ;
24
24
fn filter < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> FilterIterator < ' r , A , Self > ;
25
+ fn enumerate ( self ) -> EnumerateIterator < Self > ;
25
26
fn advance ( & mut self , f : & fn ( A ) -> bool ) ;
26
27
}
27
28
@@ -42,6 +43,11 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
42
43
FilterIterator { iter : self , predicate : predicate}
43
44
}
44
45
46
+ #[ inline( always) ]
47
+ fn enumerate ( self ) -> EnumerateIterator < T > {
48
+ EnumerateIterator { iter : self , count : 0 }
49
+ }
50
+
45
51
/// A shim implementing the `for` loop iteration protocol for iterator objects
46
52
#[ inline]
47
53
fn advance ( & mut self , f : & fn ( A ) -> bool ) {
@@ -104,3 +110,22 @@ impl<'self, A, B, T: Iterator<A>> Iterator<B> for MapIterator<'self, A, B, T> {
104
110
}
105
111
}
106
112
}
113
+
114
+ pub struct EnumerateIterator < T > {
115
+ priv iter : T ,
116
+ priv count : uint
117
+ }
118
+
119
+ impl < A , T : Iterator < A > > Iterator < ( uint , A ) > for EnumerateIterator < T > {
120
+ #[ inline]
121
+ fn next ( & mut self ) -> Option < ( uint , A ) > {
122
+ match self . iter . next ( ) {
123
+ Some ( a) => {
124
+ let ret = Some ( ( self . count , a) ) ;
125
+ self . count += 1 ;
126
+ ret
127
+ }
128
+ _ => None
129
+ }
130
+ }
131
+ }
0 commit comments