@@ -29,7 +29,7 @@ pub trait Iterator<A> {
29
29
///
30
30
/// In the future these will be default methods instead of a utility trait.
31
31
pub trait IteratorUtil < A > {
32
- fn chain ( self , other : Self ) -> ChainIterator < Self > ;
32
+ fn chain < U : Iterator < A > > ( self , other : U ) -> ChainIterator < Self , U > ;
33
33
fn zip < B , U : Iterator < B > > ( self , other : U ) -> ZipIterator < Self , U > ;
34
34
// FIXME: #5898: should be called map
35
35
fn transform < ' r , B > ( self , f : & ' r fn ( A ) -> B ) -> MapIterator < ' r , A , B , Self > ;
@@ -50,7 +50,7 @@ pub trait IteratorUtil<A> {
50
50
/// In the future these will be default methods instead of a utility trait.
51
51
impl < A , T : Iterator < A > > IteratorUtil < A > for T {
52
52
#[ inline( always) ]
53
- fn chain ( self , other : T ) -> ChainIterator < T > {
53
+ fn chain < U : Iterator < A > > ( self , other : U ) -> ChainIterator < T , U > {
54
54
ChainIterator { a : self , b : other, flag : false }
55
55
}
56
56
@@ -115,13 +115,13 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
115
115
}
116
116
}
117
117
118
- pub struct ChainIterator < T > {
118
+ pub struct ChainIterator < T , U > {
119
119
priv a: T ,
120
- priv b: T ,
120
+ priv b: U ,
121
121
priv flag : bool
122
122
}
123
123
124
- impl < A , T : Iterator < A > > Iterator < A > for ChainIterator < T > {
124
+ impl < A , T : Iterator < A > , U : Iterator < A > > Iterator < A > for ChainIterator < T , U > {
125
125
#[ inline]
126
126
fn next ( & mut self ) -> Option < A > {
127
127
if self . flag {
@@ -385,7 +385,7 @@ mod tests {
385
385
#[ test]
386
386
fn test_iterator_chain ( ) {
387
387
let xs = [ 0 u, 1 , 2 , 3 , 4 , 5 ] ;
388
- let ys = [ 30 , 40 , 50 , 60 ] ;
388
+ let ys = [ 30 u , 40 , 50 , 60 ] ;
389
389
let expected = [ 0 , 1 , 2 , 3 , 4 , 5 , 30 , 40 , 50 , 60 ] ;
390
390
let mut it = xs. iter ( ) . chain ( ys. iter ( ) ) ;
391
391
let mut i = 0 ;
@@ -394,6 +394,15 @@ mod tests {
394
394
i += 1 ;
395
395
}
396
396
assert_eq ! ( i, expected. len( ) ) ;
397
+
398
+ let ys = Counter :: new ( 30 u, 10 ) . take ( 4 ) ;
399
+ let mut it = xs. iter ( ) . transform ( |& x| x) . chain ( ys) ;
400
+ let mut i = 0 ;
401
+ for it. advance |x: uint| {
402
+ assert_eq ! ( x, expected[ i] ) ;
403
+ i += 1 ;
404
+ }
405
+ assert_eq ! ( i, expected. len( ) ) ;
397
406
}
398
407
399
408
#[ test]
0 commit comments