@@ -18,6 +18,7 @@ pub trait Iterator<A> {
18
18
}
19
19
20
20
pub trait IteratorUtil < A > {
21
+ fn chain ( self , other : Self ) -> ChainIterator < Self > ;
21
22
fn zip < B , U : Iterator < B > > ( self , other : U ) -> ZipIterator < Self , U > ;
22
23
// FIXME: #5898: should be called map
23
24
fn transform < ' r , B > ( self , f : & ' r fn ( A ) -> B ) -> MapIterator < ' r , A , B , Self > ;
@@ -31,6 +32,11 @@ pub trait IteratorUtil<A> {
31
32
}
32
33
33
34
impl < A , T : Iterator < A > > IteratorUtil < A > for T {
35
+ #[ inline( always) ]
36
+ fn chain ( self , other : T ) -> ChainIterator < T > {
37
+ ChainIterator { a : self , b : other, flag : false }
38
+ }
39
+
34
40
#[ inline( always) ]
35
41
fn zip < B , U : Iterator < B > > ( self , other : U ) -> ZipIterator < T , U > {
36
42
ZipIterator { a : self , b : other}
@@ -86,6 +92,28 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
86
92
}
87
93
}
88
94
95
+ pub struct ChainIterator < T > {
96
+ priv a: T ,
97
+ priv b: T ,
98
+ priv flag : bool
99
+ }
100
+
101
+ impl < A , T : Iterator < A > > Iterator < A > for ChainIterator < T > {
102
+ #[ inline]
103
+ fn next ( & mut self ) -> Option < A > {
104
+ if self . flag {
105
+ self . b . next ( )
106
+ } else {
107
+ match self . a . next ( ) {
108
+ Some ( x) => return Some ( x) ,
109
+ _ => ( )
110
+ }
111
+ self . flag = true ;
112
+ self . b . next ( )
113
+ }
114
+ }
115
+ }
116
+
89
117
pub struct ZipIterator < T , U > {
90
118
priv a: T ,
91
119
priv b: U
@@ -288,6 +316,20 @@ mod tests {
288
316
use super :: * ;
289
317
use prelude:: * ;
290
318
319
+ #[ test]
320
+ fn test_iterator_chain ( ) {
321
+ let xs = [ 0 u, 1 , 2 , 3 , 4 , 5 ] ;
322
+ let ys = [ 30 , 40 , 50 , 60 ] ;
323
+ let expected = [ 0 , 1 , 2 , 3 , 4 , 5 , 30 , 40 , 50 , 60 ] ;
324
+ let mut it = xs. iter ( ) . chain ( ys. iter ( ) ) ;
325
+ let mut i = 0 ;
326
+ for it. advance |& x: & uint| {
327
+ assert_eq ! ( x, expected[ i] ) ;
328
+ i += 1 ;
329
+ }
330
+ assert_eq ! ( i, expected. len( ) ) ;
331
+ }
332
+
291
333
#[ test]
292
334
fn test_iterator_enumerate ( ) {
293
335
let xs = [ 0 u, 1 , 2 , 3 , 4 , 5 ] ;
0 commit comments