diff --git a/src/core/result.rs b/src/core/result.rs index 82d67a9c..9a60d19e 100644 --- a/src/core/result.rs +++ b/src/core/result.rs @@ -1,4 +1,5 @@ mod debug_inspect; +mod flat_ok; mod into_is_ok; mod log_debug_err; mod log_err; @@ -7,7 +8,7 @@ mod not_found; mod unwrap_infallible; pub use self::{ - debug_inspect::DebugInspect, into_is_ok::IntoIsOk, log_debug_err::LogDebugErr, log_err::LogErr, + debug_inspect::DebugInspect, flat_ok::FlatOk, into_is_ok::IntoIsOk, log_debug_err::LogDebugErr, log_err::LogErr, map_expect::MapExpect, not_found::NotFound, unwrap_infallible::UnwrapInfallible, }; diff --git a/src/core/result/flat_ok.rs b/src/core/result/flat_ok.rs new file mode 100644 index 00000000..e378e5d0 --- /dev/null +++ b/src/core/result/flat_ok.rs @@ -0,0 +1,34 @@ +use super::Result; + +pub trait FlatOk { + /// Equivalent to .transpose().ok().flatten() + fn flat_ok(self) -> Option; + + /// Equivalent to .transpose().ok().flatten().ok_or(...) + fn flat_ok_or(self, err: E) -> Result; + + /// Equivalent to .transpose().ok().flatten().ok_or_else(...) + fn flat_ok_or_else E>(self, err: F) -> Result; +} + +impl FlatOk for Option> { + #[inline] + fn flat_ok(self) -> Option { self.transpose().ok().flatten() } + + #[inline] + fn flat_ok_or(self, err: Ep) -> Result { self.flat_ok().ok_or(err) } + + #[inline] + fn flat_ok_or_else Ep>(self, err: F) -> Result { self.flat_ok().ok_or_else(err) } +} + +impl FlatOk for Result, E> { + #[inline] + fn flat_ok(self) -> Option { self.ok().flatten() } + + #[inline] + fn flat_ok_or(self, err: Ep) -> Result { self.flat_ok().ok_or(err) } + + #[inline] + fn flat_ok_or_else Ep>(self, err: F) -> Result { self.flat_ok().ok_or_else(err) } +}