diff --git a/library/core/src/option.rs b/library/core/src/option.rs index baf9948857b..4eeb5e43943 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -848,6 +848,31 @@ pub fn map U>(self, f: F) -> Option { } } + /// 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(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). /// diff --git a/library/core/src/result.rs b/library/core/src/result.rs index 8fec2e928aa..a494c089f68 100644 --- a/library/core/src/result.rs +++ b/library/core/src/result.rs @@ -854,6 +854,53 @@ pub fn map_err F>(self, op: O) -> Result { } } + /// Calls the provided closure with a reference to the contained value (if [`Ok`]). + /// + /// # Examples + /// + /// ``` + /// #![feature(result_option_inspect)] + /// + /// let x: u8 = "4" + /// .parse::() + /// .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(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 { + /// 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(self, f: F) -> Self { + if let Err(ref e) = self { + f(e); + } + + self + } + ///////////////////////////////////////////////////////////////////////// // Iterator constructors /////////////////////////////////////////////////////////////////////////