std: Convert Result to use external iterators

convert iter() and iter_err() for Result. Use OptionIterator.
This commit is contained in:
blake2-ppc 2013-08-03 19:40:20 +02:00
parent ce682cb45f
commit 109e0d85a1

View File

@ -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<T, E: ToStr> Result<T, E> {
///
/// 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<T, E: ToStr> Result<T, E> {
/// 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);
}