//! Definition of the `PollFn` adapter combinator use super::assert_future; use core::fmt; use core::pin::Pin; use futures_core::future::Future; use futures_core::task::{Context, Poll}; /// Future for the [`poll_fn`] function. #[must_use = "futures do nothing unless you `.await` or poll them"] pub struct PollFn { f: F, } impl Unpin for PollFn {} /// Creates a new future wrapping around a function returning [`Poll`]. /// /// Polling the returned future delegates to the wrapped function. /// /// # Examples /// /// ``` /// # futures::executor::block_on(async { /// use futures::future::poll_fn; /// use futures::task::{Context, Poll}; /// /// fn read_line(_cx: &mut Context<'_>) -> Poll { /// Poll::Ready("Hello, World!".into()) /// } /// /// let read_future = poll_fn(read_line); /// assert_eq!(read_future.await, "Hello, World!".to_owned()); /// # }); /// ``` pub fn poll_fn(f: F) -> PollFn where F: FnMut(&mut Context<'_>) -> Poll { assert_future::(PollFn { f }) } impl fmt::Debug for PollFn { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("PollFn").finish() } } impl Future for PollFn where F: FnMut(&mut Context<'_>) -> Poll, { type Output = T; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { (&mut self.f)(cx) } }