@@ -22,8 +22,10 @@ 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
+ fn skip_while < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> SkipWhileIterator < ' r , A , Self > ;
26
+ fn take_while < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> TakeWhileIterator < ' r , A , Self > ;
27
+ fn skip ( self , n : uint ) -> SkipIterator < Self > ;
28
+ fn take ( self , n : uint ) -> TakeIterator < Self > ;
27
29
fn enumerate ( self ) -> EnumerateIterator < Self > ;
28
30
fn advance ( & mut self , f : & fn ( A ) -> bool ) ;
29
31
}
@@ -51,15 +53,25 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
51
53
}
52
54
53
55
#[ 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
+ fn skip_while < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> SkipWhileIterator < ' r , A , T > {
57
+ SkipWhileIterator { iter : self , flag : false , predicate : predicate}
56
58
}
57
59
58
60
#[ inline( always) ]
59
- fn takewhile < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> TakeWhileIterator < ' r , A , T > {
61
+ fn take_while < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> TakeWhileIterator < ' r , A , T > {
60
62
TakeWhileIterator { iter : self , flag : false , predicate : predicate}
61
63
}
62
64
65
+ #[ inline( always) ]
66
+ fn skip ( self , n : uint ) -> SkipIterator < T > {
67
+ SkipIterator { iter : self , n : n}
68
+ }
69
+
70
+ #[ inline( always) ]
71
+ fn take ( self , n : uint ) -> TakeIterator < T > {
72
+ TakeIterator { iter : self , n : n}
73
+ }
74
+
63
75
/// A shim implementing the `for` loop iteration protocol for iterator objects
64
76
#[ inline]
65
77
fn advance ( & mut self , f : & fn ( A ) -> bool ) {
@@ -142,13 +154,13 @@ impl<A, T: Iterator<A>> Iterator<(uint, A)> for EnumerateIterator<T> {
142
154
}
143
155
}
144
156
145
- pub struct DropWhileIterator < ' self , A , T > {
157
+ pub struct SkipWhileIterator < ' self , A , T > {
146
158
priv iter : T ,
147
159
priv flag : bool ,
148
160
priv predicate : & ' self fn ( & A ) -> bool
149
161
}
150
162
151
- impl < ' self , A , T : Iterator < A > > Iterator < A > for DropWhileIterator < ' self , A , T > {
163
+ impl < ' self , A , T : Iterator < A > > Iterator < A > for SkipWhileIterator < ' self , A , T > {
152
164
#[ inline]
153
165
fn next ( & mut self ) -> Option < A > {
154
166
let mut next = self . iter . next ( ) ;
@@ -199,3 +211,119 @@ impl<'self, A, T: Iterator<A>> Iterator<A> for TakeWhileIterator<'self, A, T> {
199
211
}
200
212
}
201
213
}
214
+
215
+ pub struct SkipIterator < T > {
216
+ priv iter : T ,
217
+ priv n: uint
218
+ }
219
+
220
+ impl < A , T : Iterator < A > > Iterator < A > for SkipIterator < T > {
221
+ #[ inline]
222
+ fn next ( & mut self ) -> Option < A > {
223
+ let mut next = self . iter . next ( ) ;
224
+ if self . n == 0 {
225
+ next
226
+ } else {
227
+ let n = self . n ;
228
+ for n. times {
229
+ match next {
230
+ Some ( _) => {
231
+ next = self . iter. next( ) ;
232
+ loop
233
+ }
234
+ None => {
235
+ self . n = 0 ;
236
+ return None
237
+ }
238
+ }
239
+ }
240
+ self . n = 0 ;
241
+ next
242
+ }
243
+ }
244
+ }
245
+
246
+ pub struct TakeIterator < T > {
247
+ priv iter : T ,
248
+ priv n: uint
249
+ }
250
+
251
+ impl < A , T : Iterator < A > > Iterator < A > for TakeIterator < T > {
252
+ #[ inline]
253
+ fn next ( & mut self ) -> Option < A > {
254
+ let next = self . iter . next ( ) ;
255
+ if self . n != 0 {
256
+ self . n -= 1 ;
257
+ next
258
+ } else {
259
+ None
260
+ }
261
+ }
262
+ }
263
+
264
+ #[ cfg( test) ]
265
+ mod tests {
266
+ use super :: * ;
267
+ use prelude:: * ;
268
+
269
+ #[ test]
270
+ fn test_iterator_enumerate ( ) {
271
+ let xs = [ 0 u, 1 , 2 , 3 , 4 , 5 ] ;
272
+ let mut it = xs. iter ( ) . enumerate ( ) ;
273
+ for it. advance |( i, & x) : ( uint, & uint) | {
274
+ assert_eq ! ( i, x) ;
275
+ }
276
+ }
277
+
278
+ #[ test]
279
+ fn test_iterator_take_while ( ) {
280
+ let xs = [ 0 u, 1 , 2 , 3 , 5 , 13 , 15 , 16 , 17 , 19 ] ;
281
+ let ys = [ 0 u, 1 , 2 , 3 , 5 , 13 ] ;
282
+ let mut it = xs. iter ( ) . take_while ( |& x| * x < 15 u) ;
283
+ let mut i = 0 ;
284
+ for it. advance |& x: & uint| {
285
+ assert_eq ! ( x, ys[ i] ) ;
286
+ i += 1 ;
287
+ }
288
+ assert_eq ! ( i, ys. len( ) ) ;
289
+ }
290
+
291
+ #[ test]
292
+ fn test_iterator_skip_while ( ) {
293
+ let xs = [ 0 u, 1 , 2 , 3 , 5 , 13 , 15 , 16 , 17 , 19 ] ;
294
+ let ys = [ 15 , 16 , 17 , 19 ] ;
295
+ let mut it = xs. iter ( ) . skip_while ( |& x| * x < 15 u) ;
296
+ let mut i = 0 ;
297
+ for it. advance |& x: & uint| {
298
+ assert_eq ! ( x, ys[ i] ) ;
299
+ i += 1 ;
300
+ }
301
+ assert_eq ! ( i, ys. len( ) ) ;
302
+ }
303
+
304
+ #[ test]
305
+ fn test_iterator_skip ( ) {
306
+ let xs = [ 0 u, 1 , 2 , 3 , 5 , 13 , 15 , 16 , 17 , 19 , 20 , 30 ] ;
307
+ let ys = [ 13 , 15 , 16 , 17 , 19 , 20 , 30 ] ;
308
+ let mut it = xs. iter ( ) . skip ( 5 ) ;
309
+ let mut i = 0 ;
310
+ for it. advance |& x: & uint| {
311
+ assert_eq ! ( x, ys[ i] ) ;
312
+ i += 1 ;
313
+ }
314
+ assert_eq ! ( i, ys. len( ) ) ;
315
+ }
316
+
317
+ #[ test]
318
+ fn test_iterator_take ( ) {
319
+ let xs = [ 0 u, 1 , 2 , 3 , 5 , 13 , 15 , 16 , 17 , 19 ] ;
320
+ let ys = [ 0 u, 1 , 2 , 3 , 5 ] ;
321
+ let mut it = xs. iter ( ) . take ( 5 ) ;
322
+ let mut i = 0 ;
323
+ for it. advance |& x: & uint| {
324
+ assert_eq ! ( x, ys[ i] ) ;
325
+ i += 1 ;
326
+ }
327
+ assert_eq ! ( i, ys. len( ) ) ;
328
+ }
329
+ }
0 commit comments