use std::pin::Pin; use std::future::Future; use crate::task::{Context, Poll}; /// Creates a new future wrapping around a function returning [`Poll`]. /// /// Polling the returned future delegates to the wrapped function. /// /// # Examples /// /// ``` /// # async_std::task::block_on(async { /// # /// use async_std::future; /// use async_std::task::{Context, Poll}; /// /// fn poll_greeting(_: &mut Context<'_>) -> Poll { /// Poll::Ready("hello world".to_string()) /// } /// /// assert_eq!(future::poll_fn(poll_greeting).await, "hello world"); /// # /// # }) /// ``` pub async fn poll_fn(f: F) -> T where F: FnMut(&mut Context<'_>) -> Poll, { let fut = PollFn { f }; fut.await } struct PollFn { f: F, } impl Unpin for PollFn {} 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) } }