Skip to content

Commit

Permalink
Rollup merge of #91346 - ibraheemdev:result-inspect, r=dtolnay
Browse files Browse the repository at this point in the history
Add `Option::inspect` and `Result::{inspect, inspect_err}`

```rust
// core::result

impl Result<T, E> {
    pub fn inspect<F: FnOnce(&T)>(self, f: F) -> Self;
    pub fn inspect_err<F: FnOnce(&E)>(self, f: F) -> Self;
}

// core::option

impl Option<T> {
    pub fn inspect<F: FnOnce(&T)>(self, f: F) -> Self;
}
```
  • Loading branch information
matthiaskrgr authored Dec 1, 2021
2 parents c09c16c + 2e8358e commit ce197e2
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
25 changes: 25 additions & 0 deletions library/core/src/option.rs
Original file line number Diff line number Diff line change
Expand Up @@ -848,6 +848,31 @@ impl<T> Option<T> {
}
}

/// Calls the provided closure with a reference to the contained value (if [`Some`]).
///
/// # Examples
///
/// ```
/// #![feature(result_option_inspect)]
///
/// let v = vec![1, 2, 3, 4, 5];
///
/// // prints "got: 4"
/// let x: Option<&usize> = v.get(3).inspect(|x| println!("got: {}", x));
///
/// // prints nothing
/// let x: Option<&usize> = v.get(5).inspect(|x| println!("got: {}", x));
/// ```
#[inline]
#[unstable(feature = "result_option_inspect", issue = "91345")]
pub fn inspect<F: FnOnce(&T)>(self, f: F) -> Self {
if let Some(ref x) = self {
f(x);
}

self
}

/// Returns the provided default result (if none),
/// or applies a function to the contained value (if any).
///
Expand Down
47 changes: 47 additions & 0 deletions library/core/src/result.rs
Original file line number Diff line number Diff line change
Expand Up @@ -854,6 +854,53 @@ impl<T, E> Result<T, E> {
}
}

/// Calls the provided closure with a reference to the contained value (if [`Ok`]).
///
/// # Examples
///
/// ```
/// #![feature(result_option_inspect)]
///
/// let x: u8 = "4"
/// .parse::<u8>()
/// .inspect(|x| println!("original: {}", x))
/// .map(|x| x.pow(3))
/// .expect("failed to parse number");
/// ```
#[inline]
#[unstable(feature = "result_option_inspect", issue = "91345")]
pub fn inspect<F: FnOnce(&T)>(self, f: F) -> Self {
if let Ok(ref t) = self {
f(t);
}

self
}

/// Calls the provided closure with a reference to the contained error (if [`Err`]).
///
/// # Examples
///
/// ```
/// #![feature(result_option_inspect)]
///
/// use std::{fs, io};
///
/// fn read() -> io::Result<String> {
/// fs::read_to_string("address.txt")
/// .inspect_err(|e| eprintln!("failed to read file: {}", e))
/// }
/// ```
#[inline]
#[unstable(feature = "result_option_inspect", issue = "91345")]
pub fn inspect_err<F: FnOnce(&E)>(self, f: F) -> Self {
if let Err(ref e) = self {
f(e);
}

self
}

/////////////////////////////////////////////////////////////////////////
// Iterator constructors
/////////////////////////////////////////////////////////////////////////
Expand Down

0 comments on commit ce197e2

Please sign in to comment.