Skip to content

Instantly share code, notes, and snippets.

@xicalango
Created September 29, 2015 04:03
Show Gist options
  • Save xicalango/89632e7320bd70e2f456 to your computer and use it in GitHub Desktop.
Save xicalango/89632e7320bd70e2f456 to your computer and use it in GitHub Desktop.

Flip Result <-> Option

Used for converting an Result<Option, E> into an Option<Result<R, E>> and back.

Example

let re = try!(regex::Regex::new(...));
let captures = re.captures().unwrap()
let parse_result = try!(captures.name("group").map(|captured| captured.parse()).flip())
pub trait FlipResultOption<R, E> {
fn flip(self) -> Result<Option<R>, E>;
}
impl <R, E> FlipResultOption<R, E> for Option<Result<R, E>> {
fn flip(self) -> Result<Option<R>, E> {
match self {
Some(Ok(r)) => Ok(Some(r)),
Some(Err(e)) => Err(e),
None => Ok(None)
}
}
}
pub trait FlipOptionResult<R, E> {
fn flip(self) -> Option<Result<R, E>>;
}
impl <R, E> FlipOptionResult<R, E> for Result<Option<R>, E> {
fn flip(self) -> Option<Result<R, E>> {
match self {
Ok(Some(v)) => Some(Ok(v)),
Ok(None) => None,
Err(e) => Some(Err(e))
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment