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 /// ```
36 #[cfg_attr(docsrs, doc(alias = "never"))]
pending<T>() -> Pending<T>37 pub fn pending<T>() -> Pending<T> {
38     assert_future::<T, _>(Pending { _data: marker::PhantomData })
39 }
40 
41 impl<T> Future for Pending<T> {
42     type Output = T;
43 
poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<T>44     fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<T> {
45         Poll::Pending
46     }
47 }
48 
49 impl<T> Unpin for Pending<T> {}
50 
51 impl<T> Clone for Pending<T> {
clone(&self) -> Self52     fn clone(&self) -> Self {
53         pending()
54     }
55 }
56