//! Simple "poll function" future and factory. use core::{ fmt, future::Future, task::{self, Poll}, }; use std::pin::Pin; /// Create a future driven by the provided function that receives a task context. pub(crate) fn poll_fn(f: F) -> PollFn where F: FnMut(&mut task::Context<'_>) -> Poll, { PollFn { f } } /// A Future driven by the inner function. pub(crate) struct PollFn { f: F, } impl Unpin for PollFn {} 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 task::Context<'_>) -> task::Poll, { type Output = T; fn poll(mut self: Pin<&mut Self>, cx: &mut task::Context<'_>) -> Poll { (self.f)(cx) } } #[cfg(test)] mod tests { use super::*; #[actix_rt::test] async fn test_poll_fn() { let res = poll_fn(|_| Poll::Ready(42)).await; assert_eq!(res, 42); let mut i = 5; let res = poll_fn(|cx| { i -= 1; if i > 0 { cx.waker().wake_by_ref(); Poll::Pending } else { Poll::Ready(42) } }) .await; assert_eq!(res, 42); } }