12
12
13
13
use prelude:: * ;
14
14
15
- pub trait Iterator < T > {
15
+ pub trait Iterator < A > {
16
16
/// Advance the iterator and return the next value. Return `None` when the end is reached.
17
- fn next ( & mut self ) -> Option < T > ;
17
+ fn next ( & mut self ) -> Option < A > ;
18
18
}
19
19
20
- /// A shim implementing the `for` loop iteration protocol for iterator objects
21
- #[ inline]
22
- pub fn advance < T , U : Iterator < T > > ( iter : & mut U , f : & fn ( T ) -> bool ) {
23
- loop {
24
- match iter. next ( ) {
25
- Some ( x) => {
26
- if !f ( x) { return }
20
+ pub trait IteratorUtil < A > {
21
+ fn zip < B , U : Iterator < B > > ( self , other : U ) -> ZipIterator < Self , U > ;
22
+ // FIXME: #5898: should be called map
23
+ fn transform < ' r , B > ( self , f : & ' r fn ( A ) -> B ) -> MapIterator < ' r , A , B , Self > ;
24
+ fn filter < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> FilterIterator < ' r , A , Self > ;
25
+ fn advance ( & mut self , f : & fn ( A ) -> bool ) ;
26
+ }
27
+
28
+ impl < A , T : Iterator < A > > IteratorUtil < A > for T {
29
+ #[ inline( always) ]
30
+ fn zip < B , U : Iterator < B > > ( self , other : U ) -> ZipIterator < T , U > {
31
+ ZipIterator { a : self , b : other}
32
+ }
33
+
34
+ // FIXME: #5898: should be called map
35
+ #[ inline( always) ]
36
+ fn transform < ' r , B > ( self , f : & ' r fn ( A ) -> B ) -> MapIterator < ' r , A , B , T > {
37
+ MapIterator { iter : self , f : f}
38
+ }
39
+
40
+ #[ inline( always) ]
41
+ fn filter < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> FilterIterator < ' r , A , T > {
42
+ FilterIterator { iter : self , predicate : predicate}
43
+ }
44
+
45
+ /// A shim implementing the `for` loop iteration protocol for iterator objects
46
+ #[ inline]
47
+ fn advance ( & mut self , f : & fn ( A ) -> bool ) {
48
+ loop {
49
+ match self . next ( ) {
50
+ Some ( x) => {
51
+ if !f ( x) { return }
52
+ }
53
+ None => return
27
54
}
28
- None => return
29
55
}
30
56
}
31
57
}
@@ -35,13 +61,6 @@ pub struct ZipIterator<T, U> {
35
61
priv b: U
36
62
}
37
63
38
- pub impl < A , B , T : Iterator < A > , U : Iterator < B > > ZipIterator < T , U > {
39
- #[ inline( always) ]
40
- fn new ( a : T , b : U ) -> ZipIterator < T , U > {
41
- ZipIterator { a : a, b : b}
42
- }
43
- }
44
-
45
64
impl < A , B , T : Iterator < A > , U : Iterator < B > > Iterator < ( A , B ) > for ZipIterator < T , U > {
46
65
#[ inline]
47
66
fn next ( & mut self ) -> Option < ( A , B ) > {
@@ -57,17 +76,10 @@ pub struct FilterIterator<'self, A, T> {
57
76
priv predicate : & ' self fn ( & A ) -> bool
58
77
}
59
78
60
- pub impl < ' self , A , T : Iterator < A > > FilterIterator < ' self , A , T > {
61
- #[ inline( always) ]
62
- fn new ( iter : T , predicate : & ' self fn ( & A ) -> bool ) -> FilterIterator < ' self , A , T > {
63
- FilterIterator { iter : iter, predicate : predicate}
64
- }
65
- }
66
-
67
79
impl < ' self , A , T : Iterator < A > > Iterator < A > for FilterIterator < ' self , A , T > {
68
80
#[ inline]
69
81
fn next ( & mut self ) -> Option < A > {
70
- for advance ( self ) |x| {
82
+ for self . iter . advance |x| {
71
83
if ( self . predicate ) ( & x) {
72
84
return Some ( x) ;
73
85
} else {
@@ -83,13 +95,6 @@ pub struct MapIterator<'self, A, B, T> {
83
95
priv f: & ' self fn ( A ) -> B
84
96
}
85
97
86
- pub impl < ' self , A , B , T : Iterator < A > > MapIterator < ' self , A , B , T > {
87
- #[ inline( always) ]
88
- fn new ( iter : T , f : & ' self fn ( A ) -> B ) -> MapIterator < ' self , A , B , T > {
89
- MapIterator { iter : iter, f : f}
90
- }
91
- }
92
-
93
98
impl < ' self , A , B , T : Iterator < A > > Iterator < B > for MapIterator < ' self , A , B , T > {
94
99
#[ inline]
95
100
fn next ( & mut self ) -> Option < B > {
0 commit comments