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<T> {
+	/// Equivalent to .transpose().ok().flatten()
+	fn flat_ok(self) -> Option<T>;
+
+	/// Equivalent to .transpose().ok().flatten().ok_or(...)
+	fn flat_ok_or<E>(self, err: E) -> Result<T, E>;
+
+	/// Equivalent to .transpose().ok().flatten().ok_or_else(...)
+	fn flat_ok_or_else<E, F: FnOnce() -> E>(self, err: F) -> Result<T, E>;
+}
+
+impl<T, E> FlatOk<T> for Option<Result<T, E>> {
+	#[inline]
+	fn flat_ok(self) -> Option<T> { self.transpose().ok().flatten() }
+
+	#[inline]
+	fn flat_ok_or<Ep>(self, err: Ep) -> Result<T, Ep> { self.flat_ok().ok_or(err) }
+
+	#[inline]
+	fn flat_ok_or_else<Ep, F: FnOnce() -> Ep>(self, err: F) -> Result<T, Ep> { self.flat_ok().ok_or_else(err) }
+}
+
+impl<T, E> FlatOk<T> for Result<Option<T>, E> {
+	#[inline]
+	fn flat_ok(self) -> Option<T> { self.ok().flatten() }
+
+	#[inline]
+	fn flat_ok_or<Ep>(self, err: Ep) -> Result<T, Ep> { self.flat_ok().ok_or(err) }
+
+	#[inline]
+	fn flat_ok_or_else<Ep, F: FnOnce() -> Ep>(self, err: F) -> Result<T, Ep> { self.flat_ok().ok_or_else(err) }
+}