@@ -22,6 +22,8 @@ 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 dropwhile < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> DropWhileIterator < ' r , A , Self > ;
26
+ fn takewhile < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> TakeWhileIterator < ' r , A , Self > ;
25
27
fn enumerate ( self ) -> EnumerateIterator < Self > ;
26
28
fn advance ( & mut self , f : & fn ( A ) -> bool ) ;
27
29
}
@@ -48,6 +50,16 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
48
50
EnumerateIterator { iter : self , count : 0 }
49
51
}
50
52
53
+ #[ inline( always) ]
54
+ fn dropwhile < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> DropWhileIterator < ' r , A , T > {
55
+ DropWhileIterator { iter : self , flag : false , predicate : predicate}
56
+ }
57
+
58
+ #[ inline( always) ]
59
+ fn takewhile < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> TakeWhileIterator < ' r , A , T > {
60
+ TakeWhileIterator { iter : self , flag : false , predicate : predicate}
61
+ }
62
+
51
63
/// A shim implementing the `for` loop iteration protocol for iterator objects
52
64
#[ inline]
53
65
fn advance ( & mut self , f : & fn ( A ) -> bool ) {
@@ -129,3 +141,61 @@ impl<A, T: Iterator<A>> Iterator<(uint, A)> for EnumerateIterator<T> {
129
141
}
130
142
}
131
143
}
144
+
145
+ pub struct DropWhileIterator < ' self , A , T > {
146
+ priv iter : T ,
147
+ priv flag : bool ,
148
+ priv predicate : & ' self fn ( & A ) -> bool
149
+ }
150
+
151
+ impl < ' self , A , T : Iterator < A > > Iterator < A > for DropWhileIterator < ' self , A , T > {
152
+ #[ inline]
153
+ fn next ( & mut self ) -> Option < A > {
154
+ let mut next = self . iter . next ( ) ;
155
+ if self . flag {
156
+ next
157
+ } else {
158
+ loop {
159
+ match next {
160
+ Some ( x) => {
161
+ if ( self . predicate ) ( & x) {
162
+ next = self . iter . next ( ) ;
163
+ loop
164
+ } else {
165
+ self . flag = true ;
166
+ return Some ( x)
167
+ }
168
+ }
169
+ None => return None
170
+ }
171
+ }
172
+ }
173
+ }
174
+ }
175
+
176
+ pub struct TakeWhileIterator < ' self , A , T > {
177
+ priv iter : T ,
178
+ priv flag : bool ,
179
+ priv predicate : & ' self fn ( & A ) -> bool
180
+ }
181
+
182
+ impl < ' self , A , T : Iterator < A > > Iterator < A > for TakeWhileIterator < ' self , A , T > {
183
+ #[ inline]
184
+ fn next ( & mut self ) -> Option < A > {
185
+ if self . flag {
186
+ None
187
+ } else {
188
+ match self . iter . next ( ) {
189
+ Some ( x) => {
190
+ if ( self . predicate ) ( & x) {
191
+ Some ( x)
192
+ } else {
193
+ self . flag = true ;
194
+ None
195
+ }
196
+ }
197
+ None => None
198
+ }
199
+ }
200
+ }
201
+ }
0 commit comments