add FlatOk trait to Result/Option suite

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-10-03 00:30:16 +00:00 committed by strawberry
parent 08a2fecc0e
commit a2e5c3d5d3
2 changed files with 36 additions and 1 deletions

View file

@ -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) }
}