@@ -24,6 +24,8 @@ pub trait IteratorUtil<A> {
24
24
fn filter < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> FilterIterator < ' r , A , Self > ;
25
25
fn dropwhile < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> DropWhileIterator < ' r , A , Self > ;
26
26
fn takewhile < ' 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
}
@@ -60,6 +62,16 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for 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 ) {
@@ -199,3 +211,52 @@ 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
+ }
0 commit comments