From 2e8358e1ab933c6599b40294c0b33a1a17d19a23 Mon Sep 17 00:00:00 2001 From: Ibraheem Ahmed Date: Sun, 28 Nov 2021 23:31:32 -0500 Subject: [PATCH] add `Option::inspect` and `Result::{inspect, inspect_err}` --- library/core/src/option.rs | 25 ++++++++++++++++++++ library/core/src/result.rs | 47 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/library/core/src/option.rs b/library/core/src/option.rs index baf9948857bbe..4eeb5e4394386 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -848,6 +848,31 @@ impl 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 8fec2e928aae2..a494c089f68ba 100644 --- a/library/core/src/result.rs +++ b/library/core/src/result.rs @@ -854,6 +854,53 @@ impl 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 /////////////////////////////////////////////////////////////////////////