From 109e0d85a14f62e08b324feb89d6baa740e25319 Mon Sep 17 00:00:00 2001 From: blake2-ppc Date: Sat, 3 Aug 2013 19:40:20 +0200 Subject: [PATCH] std: Convert Result to use external iterators convert iter() and iter_err() for Result. Use OptionIterator. --- src/libstd/result.rs | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/libstd/result.rs b/src/libstd/result.rs index 181590e3929c..e06e58acbc8e 100644 --- a/src/libstd/result.rs +++ b/src/libstd/result.rs @@ -16,7 +16,7 @@ use clone::Clone; use cmp::Eq; use either; use iterator::Iterator; -use option::{None, Option, Some}; +use option::{None, Option, Some, OptionIterator}; use vec; use vec::{OwnedVector, ImmutableVector}; use container::Container; @@ -86,15 +86,15 @@ impl Result { /// /// Example: /// - /// do read_file(file).iter |buf| { + /// for buf in read_file(file) { /// print_buf(buf) /// } #[inline] - pub fn iter(&self, f: &fn(&T)) { + pub fn iter<'r>(&'r self) -> OptionIterator<&'r T> { match *self { - Ok(ref t) => f(t), - Err(_) => (), - } + Ok(ref t) => Some(t), + Err(*) => None, + }.consume_iter() } /// Call a method based on a previous result @@ -104,11 +104,11 @@ impl Result { /// immediately returned. This function can be used to pass through a /// successful result while handling an error. #[inline] - pub fn iter_err(&self, f: &fn(&E)) { + pub fn iter_err<'r>(&'r self) -> OptionIterator<&'r E> { match *self { - Ok(_) => (), - Err(ref e) => f(e), - } + Ok(*) => None, + Err(ref t) => Some(t), + }.consume_iter() } /// Unwraps a result, yielding the content of an `Ok`. @@ -335,21 +335,25 @@ mod tests { #[test] pub fn test_impl_iter() { let mut valid = false; - Ok::<~str, ~str>(~"a").iter(|_x| valid = true); + let okval = Ok::<~str, ~str>(~"a"); + do okval.iter().next().map |_| { valid = true; }; assert!(valid); - Err::<~str, ~str>(~"b").iter(|_x| valid = false); + let errval = Err::<~str, ~str>(~"b"); + do errval.iter().next().map |_| { valid = false; }; assert!(valid); } #[test] pub fn test_impl_iter_err() { let mut valid = true; - Ok::<~str, ~str>(~"a").iter_err(|_x| valid = false); + let okval = Ok::<~str, ~str>(~"a"); + do okval.iter_err().next().map |_| { valid = false }; assert!(valid); valid = false; - Err::<~str, ~str>(~"b").iter_err(|_x| valid = true); + let errval = Err::<~str, ~str>(~"b"); + do errval.iter_err().next().map |_| { valid = true }; assert!(valid); }