add unwrap_or_default() to future TryExt extension

start an OptionFuture extension

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-12-07 06:02:59 +00:00
parent d921b82376
commit aa6d0fcaa7
3 changed files with 38 additions and 0 deletions

View file

@ -1,3 +1,5 @@
mod option_ext;
mod try_ext_ext; mod try_ext_ext;
pub use option_ext::OptionExt;
pub use try_ext_ext::TryExtExt; pub use try_ext_ext::TryExtExt;

View file

@ -0,0 +1,22 @@
#![allow(clippy::wrong_self_convention)]
use futures::{future::OptionFuture, Future, FutureExt};
pub trait OptionExt<T> {
fn is_none_or(self, f: impl FnOnce(&T) -> bool + Send) -> impl Future<Output = bool> + Send;
fn is_some_and(self, f: impl FnOnce(&T) -> bool + Send) -> impl Future<Output = bool> + Send;
}
impl<T, Fut> OptionExt<T> for OptionFuture<Fut>
where
Fut: Future<Output = T> + Send,
{
fn is_none_or(self, f: impl FnOnce(&T) -> bool + Send) -> impl Future<Output = bool> + Send {
self.map(|o| o.as_ref().is_none_or(f))
}
fn is_some_and(self, f: impl FnOnce(&T) -> bool + Send) -> impl Future<Output = bool> + Send {
self.map(|o| o.as_ref().is_some_and(f))
}
}

View file

@ -39,6 +39,11 @@ where
fn unwrap_or(self, default: Self::Ok) -> UnwrapOrElse<Self, impl FnOnce(Self::Error) -> Self::Ok> fn unwrap_or(self, default: Self::Ok) -> UnwrapOrElse<Self, impl FnOnce(Self::Error) -> Self::Ok>
where where
Self: Sized; Self: Sized;
fn unwrap_or_default(self) -> UnwrapOrElse<Self, impl FnOnce(Self::Error) -> Self::Ok>
where
Self: Sized,
Self::Ok: Default;
} }
impl<T, E, Fut> TryExtExt<T, E> for Fut impl<T, E, Fut> TryExtExt<T, E> for Fut
@ -89,4 +94,13 @@ where
{ {
self.unwrap_or_else(move |_| default) self.unwrap_or_else(move |_| default)
} }
#[inline]
fn unwrap_or_default(self) -> UnwrapOrElse<Self, impl FnOnce(Self::Error) -> Self::Ok>
where
Self: Sized,
Self::Ok: Default,
{
self.unwrap_or(Default::default())
}
} }