@@ -47,10 +47,10 @@ pub trait IteratorUtil<A> {
47
47
fn advance ( & mut self , f : & fn ( A ) -> bool ) ;
48
48
#[ cfg( not( stage0) ) ]
49
49
fn advance ( & mut self , f : & fn ( A ) -> bool ) -> bool ;
50
- fn to_vec ( self ) -> ~ [ A ] ;
51
- fn nth ( & mut self , n : uint ) -> A ;
52
- fn first ( & mut self ) -> A ;
53
- fn last ( & mut self ) -> A ;
50
+ # [ cfg ( not ( stage0 ) ) ]
51
+ fn to_vec ( & mut self ) -> ~ [ A ] ;
52
+ fn nth ( & mut self , n : uint ) -> Option < A > ;
53
+ fn last ( & mut self ) -> Option < A > ;
54
54
fn fold < B > ( & mut self , start : B , f : & fn ( B , A ) -> B ) -> B ;
55
55
fn count ( & mut self ) -> uint ;
56
56
fn all ( & mut self , f : & fn ( & A ) -> bool ) -> bool ;
@@ -147,47 +147,30 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
147
147
}
148
148
}
149
149
150
+ #[ cfg( not( stage0) ) ]
150
151
#[ inline( always) ]
151
- fn to_vec ( self ) -> ~[ A ] {
152
- let mut v = ~[ ] ;
153
- let mut it = self ;
154
- for it. advance( ) |x| { v. push ( x) ; }
155
- return v;
152
+ fn to_vec ( & mut self ) -> ~[ A ] {
153
+ iter:: to_vec :: < A > ( |f| self . advance ( f) )
156
154
}
157
155
158
- /// Get `n`th element of an iterator.
156
+ /// Return the `n`th item yielded by an iterator.
159
157
#[ inline( always) ]
160
- fn nth ( & mut self , n : uint ) -> A {
161
- let mut i = n;
158
+ fn nth ( & mut self , mut n : uint ) -> Option < A > {
162
159
loop {
163
160
match self . next ( ) {
164
- Some ( x) => { if i == 0 { return x ; } }
165
- None => { fail ! ( "cannot get %uth element" , n ) }
161
+ Some ( x) => if n == 0 { return Some ( x ) } ,
162
+ None => return None
166
163
}
167
- i -= 1 ;
164
+ n -= 1 ;
168
165
}
169
166
}
170
167
171
- // Get first elemet of an iterator.
168
+ /// Return the last item yielded by an iterator.
172
169
#[ inline( always) ]
173
- fn first ( & mut self ) -> A {
174
- match self . next ( ) {
175
- Some ( x) => x ,
176
- None => fail ! ( "cannot get first element" )
177
- }
178
- }
179
-
180
- // Get last element of an iterator.
181
- //
182
- // If the iterator have an infinite length, this method won't return.
183
- #[ inline( always) ]
184
- fn last ( & mut self ) -> A {
185
- let mut elm = match self . next ( ) {
186
- Some ( x) => x,
187
- None => fail ! ( "cannot get last element" )
188
- } ;
189
- for self . advance |e| { elm = e; }
190
- return elm;
170
+ fn last ( & mut self ) -> Option < A > {
171
+ let mut last = None ;
172
+ for self . advance |x| { last = Some ( x) ; }
173
+ last
191
174
}
192
175
193
176
/// Reduce an iterator to an accumulated value
@@ -203,7 +186,7 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
203
186
return accum;
204
187
}
205
188
206
- /// Count the number of an iterator elemenrs
189
+ /// Count the number of items yielded by an iterator
207
190
#[ inline( always) ]
208
191
fn count ( & mut self ) -> uint { self . fold ( 0 , |cnt, _x| cnt + 1 ) }
209
192
@@ -344,17 +327,13 @@ pub struct FilterMapIterator<'self, A, B, T> {
344
327
impl < ' self , A , B , T : Iterator < A > > Iterator < B > for FilterMapIterator < ' self , A , B , T > {
345
328
#[ inline]
346
329
fn next ( & mut self ) -> Option < B > {
347
- loop {
348
- match self . iter . next ( ) {
349
- None => { return None ; }
350
- Some ( a) => {
351
- match ( self . f ) ( a) {
352
- Some ( b) => { return Some ( b) ; }
353
- None => { loop ; }
354
- }
355
- }
330
+ for self . iter. advance |x| {
331
+ match ( self . f ) ( x) {
332
+ Some ( y) => return Some ( y) ,
333
+ None => ( )
356
334
}
357
335
}
336
+ None
358
337
}
359
338
}
360
339
@@ -579,7 +558,7 @@ mod tests {
579
558
580
559
#[ test]
581
560
fn test_filter_map ( ) {
582
- let it = Counter :: new ( 0 u, 1 u) . take ( 10 )
561
+ let mut it = Counter :: new ( 0 u, 1 u) . take ( 10 )
583
562
. filter_map ( |x : uint | if x. is_even ( ) { Some ( x* x) } else { None } ) ;
584
563
assert_eq ! ( it. to_vec( ) , ~[ 0 * 0 , 2 * 2 , 4 * 4 , 6 * 6 , 8 * 8 ] ) ;
585
564
}
@@ -689,43 +668,15 @@ mod tests {
689
668
fn test_iterator_nth ( ) {
690
669
let v = & [ 0 , 1 , 2 , 3 , 4 ] ;
691
670
for uint:: range( 0 , v. len( ) ) |i| {
692
- assert_eq ! ( v. iter( ) . nth( i) , & v[ i] ) ;
671
+ assert_eq ! ( v. iter( ) . nth( i) . unwrap ( ) , & v[ i] ) ;
693
672
}
694
673
}
695
674
696
- #[ test]
697
- #[ should_fail]
698
- fn test_iterator_nth_fail ( ) {
699
- let v = & [ 0 , 1 , 2 , 3 , 4 ] ;
700
- v. iter ( ) . nth ( 5 ) ;
701
- }
702
-
703
- #[ test]
704
- fn test_iterator_first ( ) {
705
- let v = & [ 0 , 1 , 2 , 3 , 4 ] ;
706
- assert_eq ! ( v. iter( ) . first( ) , & 0 ) ;
707
- assert_eq ! ( v. slice( 2 , 5 ) . iter( ) . first( ) , & 2 ) ;
708
- }
709
-
710
- #[ test]
711
- #[ should_fail]
712
- fn test_iterator_first_fail ( ) {
713
- let v: & [ uint ] = & [ ] ;
714
- v. iter ( ) . first ( ) ;
715
- }
716
-
717
675
#[ test]
718
676
fn test_iterator_last ( ) {
719
677
let v = & [ 0 , 1 , 2 , 3 , 4 ] ;
720
- assert_eq ! ( v. iter( ) . last( ) , & 4 ) ;
721
- assert_eq ! ( v. slice( 0 , 1 ) . iter( ) . last( ) , & 0 ) ;
722
- }
723
-
724
- #[ test]
725
- #[ should_fail]
726
- fn test_iterator_last_fail ( ) {
727
- let v: & [ uint ] = & [ ] ;
728
- v. iter ( ) . last ( ) ;
678
+ assert_eq ! ( v. iter( ) . last( ) . unwrap( ) , & 4 ) ;
679
+ assert_eq ! ( v. slice( 0 , 1 ) . iter( ) . last( ) . unwrap( ) , & 0 ) ;
729
680
}
730
681
731
682
#[ test]
0 commit comments