1 use super::assert_future; 2 use core::marker; 3 use core::pin::Pin; 4 use futures_core::future::{FusedFuture, Future}; 5 use futures_core::task::{Context, Poll}; 6 7 /// Future for the [`pending()`] function. 8 #[derive(Debug)] 9 #[must_use = "futures do nothing unless you `.await` or poll them"] 10 pub struct Pending<T> { 11 _data: marker::PhantomData<T>, 12 } 13 14 impl<T> FusedFuture for Pending<T> { is_terminated(&self) -> bool15 fn is_terminated(&self) -> bool { 16 true 17 } 18 } 19 20 /// Creates a future which never resolves, representing a computation that never 21 /// finishes. 22 /// 23 /// The returned future will forever return [`Poll::Pending`]. 24 /// 25 /// # Examples 26 /// 27 /// ```ignore 28 /// # futures::executor::block_on(async { 29 /// use futures::future; 30 /// 31 /// let future = future::pending(); 32 /// let () = future.await; 33 /// unreachable!(); 34 /// # }); 35 /// ``` pending<T>() -> Pending<T>36pub fn pending<T>() -> Pending<T> { 37 assert_future::<T, _>(Pending { _data: marker::PhantomData }) 38 } 39 40 impl<T> Future for Pending<T> { 41 type Output = T; 42 poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<T>43 fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<T> { 44 Poll::Pending 45 } 46 } 47 48 impl<T> Unpin for Pending<T> {} 49 50 impl<T> Clone for Pending<T> { clone(&self) -> Self51 fn clone(&self) -> Self { 52 pending() 53 } 54 } 55