diff options
| author | bors <bors@rust-lang.org> | 2020-03-29 14:48:58 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-03-29 14:48:58 +0000 |
| commit | 285519d412ef9c65df3bcd2de2b1a3d6ca16a255 (patch) | |
| tree | 27bae9b4daff1595d72f320e89353f4aa817391c /src/libcore | |
| parent | 8ab82b87af4f20b6c0a481e050517103d50263e9 (diff) | |
| parent | b851591731ef4e8017672e1e94ea55a44396d593 (diff) | |
| download | rust-285519d412ef9c65df3bcd2de2b1a3d6ca16a255.tar.gz rust-285519d412ef9c65df3bcd2de2b1a3d6ca16a255.zip | |
Auto merge of #70534 - Centril:rollup-t59tcx2, r=Centril
Rollup of 3 pull requests Successful merges: - #70140 (Add Result<Result<T, E>, E>::flatten -> Result<T, E>) - #70526 (reduce `rustc_attr` usage in places) - #70527 (Update LLVM submodule) Failed merges: r? @ghost
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/result.rs | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/libcore/result.rs b/src/libcore/result.rs index 0bc29e1bc66..0087b92f1f2 100644 --- a/src/libcore/result.rs +++ b/src/libcore/result.rs @@ -230,9 +230,9 @@ #![stable(feature = "rust1", since = "1.0.0")] -use crate::fmt; use crate::iter::{self, FromIterator, FusedIterator, TrustedLen}; use crate::ops::{self, Deref, DerefMut}; +use crate::{convert, fmt}; /// `Result` is a type that represents either success ([`Ok`]) or failure ([`Err`]). /// @@ -1214,6 +1214,38 @@ impl<T, E> Result<Option<T>, E> { } } +impl<T, E> Result<Result<T, E>, E> { + /// Converts from `Result<Result<T, E>, E>` to `Result<T, E>` + /// + /// # Examples + /// Basic usage: + /// ``` + /// #![feature(result_flattening)] + /// let x: Result<Result<&'static str, u32>, u32> = Ok(Ok("hello")); + /// assert_eq!(Ok("hello"), x.flatten()); + /// + /// let x: Result<Result<&'static str, u32>, u32> = Ok(Err(6)); + /// assert_eq!(Err(6), x.flatten()); + /// + /// let x: Result<Result<&'static str, u32>, u32> = Err(6); + /// assert_eq!(Err(6), x.flatten()); + /// ``` + /// + /// Flattening once only removes one level of nesting: + /// + /// ``` + /// #![feature(result_flattening)] + /// let x: Result<Result<Result<&'static str, u32>, u32>, u32> = Ok(Ok(Ok("hello"))); + /// assert_eq!(Ok(Ok("hello")), x.flatten()); + /// assert_eq!(Ok("hello"), x.flatten().flatten()); + /// ``` + #[inline] + #[unstable(feature = "result_flattening", issue = "70142")] + pub fn flatten(self) -> Result<T, E> { + self.and_then(convert::identity) + } +} + // This is a separate function to reduce the code size of the methods #[inline(never)] #[cold] |
