@@ -16,7 +16,7 @@ use option::{Some, None};
16
16
use clone:: Clone ;
17
17
use container:: Container ;
18
18
use cmp:: Eq ;
19
- use iterator:: Iterator ;
19
+ use iterator:: { Iterator , FilterMap } ;
20
20
use result:: Result ;
21
21
use result;
22
22
use str:: StrSlice ;
@@ -116,32 +116,35 @@ impl<L, R> Either<L, R> {
116
116
}
117
117
}
118
118
119
- // FIXME: #8228 Replaceable by an external iterator?
120
- /// Extracts from a vector of either all the left values
121
- pub fn lefts < L : Clone , R > ( eithers : & [ Either < L , R > ] ) -> ~[ L ] {
122
- do vec:: build_sized ( eithers. len ( ) ) |push| {
123
- for elt in eithers. iter ( ) {
124
- match * elt {
125
- Left ( ref l) => { push ( ( * l) . clone ( ) ) ; }
126
- _ => { /* fallthrough */ }
127
- }
119
+ /// An iterator yielding the `Left` values of its source
120
+ pub type Lefts < L , R , Iter > = FilterMap < ' static , Either < L , R > , L , Iter > ;
121
+
122
+ /// An iterator yielding the `Right` values of its source
123
+ pub type Rights < L , R , Iter > = FilterMap < ' static , Either < L , R > , R , Iter > ;
124
+
125
+ /// Extracts all the left values
126
+ pub fn lefts < L , R , Iter : Iterator < Either < L , R > > > ( eithers : Iter )
127
+ -> Lefts < L , R , Iter > {
128
+ do eithers. filter_map |elt| {
129
+ match elt {
130
+ Left ( x) => Some ( x) ,
131
+ _ => None ,
128
132
}
129
133
}
130
134
}
131
135
132
- // FIXME: #8228 Replaceable by an external iterator?
133
- /// Extracts from a vector of either all the right values
134
- pub fn rights < L , R : Clone > ( eithers : & [ Either < L , R > ] ) -> ~[ R ] {
135
- do vec:: build_sized ( eithers. len ( ) ) |push| {
136
- for elt in eithers. iter ( ) {
137
- match * elt {
138
- Right ( ref r) => { push ( ( * r) . clone ( ) ) ; }
139
- _ => { /* fallthrough */ }
140
- }
136
+ /// Extracts all the right values
137
+ pub fn rights < L , R , Iter : Iterator < Either < L , R > > > ( eithers : Iter )
138
+ -> Rights < L , R , Iter > {
139
+ do eithers. filter_map |elt| {
140
+ match elt {
141
+ Right ( x) => Some ( x) ,
142
+ _ => None ,
141
143
}
142
144
}
143
145
}
144
146
147
+
145
148
// FIXME: #8228 Replaceable by an external iterator?
146
149
/// Extracts from a vector of either all the left values and right values
147
150
///
@@ -182,42 +185,42 @@ mod tests {
182
185
#[ test]
183
186
fn test_lefts ( ) {
184
187
let input = ~[ Left ( 10 ) , Right ( 11 ) , Left ( 12 ) , Right ( 13 ) , Left ( 14 ) ] ;
185
- let result = lefts ( input) ;
188
+ let result = lefts ( input. move_iter ( ) ) . to_owned_vec ( ) ;
186
189
assert_eq ! ( result, ~[ 10 , 12 , 14 ] ) ;
187
190
}
188
191
189
192
#[ test]
190
193
fn test_lefts_none ( ) {
191
194
let input: ~[ Either < int , int > ] = ~[ Right ( 10 ) , Right ( 10 ) ] ;
192
- let result = lefts ( input) ;
195
+ let result = lefts ( input. move_iter ( ) ) . to_owned_vec ( ) ;
193
196
assert_eq ! ( result. len( ) , 0 u) ;
194
197
}
195
198
196
199
#[ test]
197
200
fn test_lefts_empty ( ) {
198
201
let input: ~[ Either < int , int > ] = ~[ ] ;
199
- let result = lefts ( input) ;
202
+ let result = lefts ( input. move_iter ( ) ) . to_owned_vec ( ) ;
200
203
assert_eq ! ( result. len( ) , 0 u) ;
201
204
}
202
205
203
206
#[ test]
204
207
fn test_rights ( ) {
205
208
let input = ~[ Left ( 10 ) , Right ( 11 ) , Left ( 12 ) , Right ( 13 ) , Left ( 14 ) ] ;
206
- let result = rights ( input) ;
209
+ let result = rights ( input. move_iter ( ) ) . to_owned_vec ( ) ;
207
210
assert_eq ! ( result, ~[ 11 , 13 ] ) ;
208
211
}
209
212
210
213
#[ test]
211
214
fn test_rights_none ( ) {
212
215
let input: ~[ Either < int , int > ] = ~[ Left ( 10 ) , Left ( 10 ) ] ;
213
- let result = rights ( input) ;
216
+ let result = rights ( input. move_iter ( ) ) . to_owned_vec ( ) ;
214
217
assert_eq ! ( result. len( ) , 0 u) ;
215
218
}
216
219
217
220
#[ test]
218
221
fn test_rights_empty ( ) {
219
222
let input: ~[ Either < int , int > ] = ~[ ] ;
220
- let result = rights ( input) ;
223
+ let result = rights ( input. move_iter ( ) ) . to_owned_vec ( ) ;
221
224
assert_eq ! ( result. len( ) , 0 u) ;
222
225
}
223
226
0 commit comments