Skip to content

Commit f70737c

Browse files
author
blake2-ppc
committed
std: Change either::{lefts, rights} to return an iterator
1 parent ecfc9a8 commit f70737c

File tree

2 files changed

+31
-28
lines changed

2 files changed

+31
-28
lines changed

src/libstd/either.rs

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use option::{Some, None};
1616
use clone::Clone;
1717
use container::Container;
1818
use cmp::Eq;
19-
use iterator::Iterator;
19+
use iterator::{Iterator, FilterMap};
2020
use result::Result;
2121
use result;
2222
use str::StrSlice;
@@ -116,32 +116,35 @@ impl<L, R> Either<L, R> {
116116
}
117117
}
118118

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,
128132
}
129133
}
130134
}
131135

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,
141143
}
142144
}
143145
}
144146

147+
145148
// FIXME: #8228 Replaceable by an external iterator?
146149
/// Extracts from a vector of either all the left values and right values
147150
///
@@ -182,42 +185,42 @@ mod tests {
182185
#[test]
183186
fn test_lefts() {
184187
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();
186189
assert_eq!(result, ~[10, 12, 14]);
187190
}
188191

189192
#[test]
190193
fn test_lefts_none() {
191194
let input: ~[Either<int, int>] = ~[Right(10), Right(10)];
192-
let result = lefts(input);
195+
let result = lefts(input.move_iter()).to_owned_vec();
193196
assert_eq!(result.len(), 0u);
194197
}
195198

196199
#[test]
197200
fn test_lefts_empty() {
198201
let input: ~[Either<int, int>] = ~[];
199-
let result = lefts(input);
202+
let result = lefts(input.move_iter()).to_owned_vec();
200203
assert_eq!(result.len(), 0u);
201204
}
202205

203206
#[test]
204207
fn test_rights() {
205208
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();
207210
assert_eq!(result, ~[11, 13]);
208211
}
209212

210213
#[test]
211214
fn test_rights_none() {
212215
let input: ~[Either<int, int>] = ~[Left(10), Left(10)];
213-
let result = rights(input);
216+
let result = rights(input.move_iter()).to_owned_vec();
214217
assert_eq!(result.len(), 0u);
215218
}
216219

217220
#[test]
218221
fn test_rights_empty() {
219222
let input: ~[Either<int, int>] = ~[];
220-
let result = rights(input);
223+
let result = rights(input.move_iter()).to_owned_vec();
221224
assert_eq!(result.len(), 0u);
222225
}
223226

src/libsyntax/parse/parser.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3458,7 +3458,7 @@ impl Parser {
34583458
|p| p.parse_arg()
34593459
);
34603460

3461-
let inputs = either::lefts(args_or_capture_items);
3461+
let inputs = either::lefts(args_or_capture_items.move_iter()).collect();
34623462

34633463
let (ret_style, ret_ty) = self.parse_ret_ty();
34643464
ast::fn_decl {
@@ -3621,7 +3621,7 @@ impl Parser {
36213621

36223622
let hi = self.span.hi;
36233623

3624-
let inputs = either::lefts(args_or_capture_items);
3624+
let inputs = either::lefts(args_or_capture_items.move_iter()).collect();
36253625
let (ret_style, ret_ty) = self.parse_ret_ty();
36263626

36273627
let fn_decl = ast::fn_decl {
@@ -3654,7 +3654,7 @@ impl Parser {
36543654
};
36553655

36563656
ast::fn_decl {
3657-
inputs: either::lefts(inputs_captures),
3657+
inputs: either::lefts(inputs_captures.move_iter()).collect(),
36583658
output: output,
36593659
cf: return_val,
36603660
}

0 commit comments

Comments
 (0)