From a5f9494199c0990002b52c29fed998c5753f4a0b Mon Sep 17 00:00:00 2001 From: blake2-ppc Date: Mon, 12 Aug 2013 18:39:39 +0200 Subject: [PATCH] std: Change either::{lefts, rights} to return an iterator --- src/libstd/either.rs | 53 ++++++++++++++++++----------------- src/libsyntax/parse/parser.rs | 6 ++-- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/libstd/either.rs b/src/libstd/either.rs index 132ebc72960..7150430893b 100644 --- a/src/libstd/either.rs +++ b/src/libstd/either.rs @@ -16,7 +16,7 @@ use option::{Some, None}; use clone::Clone; use container::Container; use cmp::Eq; -use iterator::Iterator; +use iterator::{Iterator, FilterMap}; use result::Result; use result; use str::StrSlice; @@ -116,32 +116,35 @@ impl Either { } } -// FIXME: #8228 Replaceable by an external iterator? -/// Extracts from a vector of either all the left values -pub fn lefts(eithers: &[Either]) -> ~[L] { - do vec::build_sized(eithers.len()) |push| { - for elt in eithers.iter() { - match *elt { - Left(ref l) => { push((*l).clone()); } - _ => { /* fallthrough */ } - } +/// An iterator yielding the `Left` values of its source +pub type Lefts = FilterMap<'static, Either, L, Iter>; + +/// An iterator yielding the `Right` values of its source +pub type Rights = FilterMap<'static, Either, R, Iter>; + +/// Extracts all the left values +pub fn lefts>>(eithers: Iter) + -> Lefts { + do eithers.filter_map |elt| { + match elt { + Left(x) => Some(x), + _ => None, } } } -// FIXME: #8228 Replaceable by an external iterator? -/// Extracts from a vector of either all the right values -pub fn rights(eithers: &[Either]) -> ~[R] { - do vec::build_sized(eithers.len()) |push| { - for elt in eithers.iter() { - match *elt { - Right(ref r) => { push((*r).clone()); } - _ => { /* fallthrough */ } - } +/// Extracts all the right values +pub fn rights>>(eithers: Iter) + -> Rights { + do eithers.filter_map |elt| { + match elt { + Right(x) => Some(x), + _ => None, } } } + // FIXME: #8228 Replaceable by an external iterator? /// Extracts from a vector of either all the left values and right values /// @@ -182,42 +185,42 @@ mod tests { #[test] fn test_lefts() { let input = ~[Left(10), Right(11), Left(12), Right(13), Left(14)]; - let result = lefts(input); + let result = lefts(input.move_iter()).to_owned_vec(); assert_eq!(result, ~[10, 12, 14]); } #[test] fn test_lefts_none() { let input: ~[Either] = ~[Right(10), Right(10)]; - let result = lefts(input); + let result = lefts(input.move_iter()).to_owned_vec(); assert_eq!(result.len(), 0u); } #[test] fn test_lefts_empty() { let input: ~[Either] = ~[]; - let result = lefts(input); + let result = lefts(input.move_iter()).to_owned_vec(); assert_eq!(result.len(), 0u); } #[test] fn test_rights() { let input = ~[Left(10), Right(11), Left(12), Right(13), Left(14)]; - let result = rights(input); + let result = rights(input.move_iter()).to_owned_vec(); assert_eq!(result, ~[11, 13]); } #[test] fn test_rights_none() { let input: ~[Either] = ~[Left(10), Left(10)]; - let result = rights(input); + let result = rights(input.move_iter()).to_owned_vec(); assert_eq!(result.len(), 0u); } #[test] fn test_rights_empty() { let input: ~[Either] = ~[]; - let result = rights(input); + let result = rights(input.move_iter()).to_owned_vec(); assert_eq!(result.len(), 0u); } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index b38de31c56a..a2664dcf890 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3445,7 +3445,7 @@ impl Parser { |p| p.parse_arg() ); - let inputs = either::lefts(args_or_capture_items); + let inputs = either::lefts(args_or_capture_items.move_iter()).collect(); let (ret_style, ret_ty) = self.parse_ret_ty(); ast::fn_decl { @@ -3608,7 +3608,7 @@ impl Parser { let hi = self.span.hi; - let inputs = either::lefts(args_or_capture_items); + let inputs = either::lefts(args_or_capture_items.move_iter()).collect(); let (ret_style, ret_ty) = self.parse_ret_ty(); let fn_decl = ast::fn_decl { @@ -3641,7 +3641,7 @@ impl Parser { }; ast::fn_decl { - inputs: either::lefts(inputs_captures), + inputs: either::lefts(inputs_captures.move_iter()).collect(), output: output, cf: return_val, }