From c34f95284409dcedd279f475c537fbf87b56fd41 Mon Sep 17 00:00:00 2001 From: Darius Date: Mon, 24 Feb 2025 08:58:43 -0600 Subject: [PATCH] feat: Add direct conversion for optional future and streams --- src/futures/optional.rs | 22 ++++++++++++++++++++++ src/stream/optional.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/futures/optional.rs b/src/futures/optional.rs index 4df41e2..fb306a8 100644 --- a/src/futures/optional.rs +++ b/src/futures/optional.rs @@ -35,6 +35,15 @@ impl From> for OptionalFuture { } } +impl From for OptionalFuture { + fn from(fut: F) -> Self { + Self { + future: Some(fut), + waker: None, + } + } +} + impl OptionalFuture { /// Construct a new `OptionalFuture` with an existing `Future`. pub fn new(future: F) -> Self { @@ -149,4 +158,17 @@ mod test { assert_eq!(val, Poll::Ready(1)); assert!(future.is_none()); } + + #[test] + fn convert_future_to_optional_future() { + let fut = futures::future::ready(0); + + let mut future = OptionalFuture::from(fut); + assert!(future.is_some()); + let waker = futures::task::noop_waker_ref(); + + let val = Pin::new(&mut future).poll(&mut Context::from_waker(waker)); + assert_eq!(val, Poll::Ready(0)); + assert!(future.is_none()); + } } diff --git a/src/stream/optional.rs b/src/stream/optional.rs index ae7e085..2630e71 100644 --- a/src/stream/optional.rs +++ b/src/stream/optional.rs @@ -34,6 +34,15 @@ impl From> for OptionalStream { } } +impl From for OptionalStream { + fn from(st: S) -> Self { + Self { + stream: Some(st), + waker: None, + } + } +} + impl OptionalStream { /// Constructs a new `OptionalStream` with an existing `Stream`. pub fn new(st: S) -> Self { @@ -169,4 +178,22 @@ mod test { assert_eq!(val, Poll::Ready(None)); assert!(stream.is_none()); } + + #[test] + fn convert_stream_to_optional_stream() { + let st = futures::stream::once(async { 0 }).boxed(); + + let mut stream = OptionalStream::from(st); + + assert!(stream.is_some()); + let waker = futures::task::noop_waker_ref(); + + let val = Pin::new(&mut stream).poll_next(&mut Context::from_waker(waker)); + assert_eq!(val, Poll::Ready(Some(0))); + assert!(stream.is_some()); + + let val = Pin::new(&mut stream).poll_next(&mut Context::from_waker(waker)); + assert_eq!(val, Poll::Ready(None)); + assert!(stream.is_none()); + } }