1 | use crate::fmt::{self, Debug}; |
2 | use crate::future::Future; |
3 | use crate::marker; |
4 | use crate::pin::Pin; |
5 | use crate::task::{Context, Poll}; |
6 | |
7 | /// Creates a future which never resolves, representing a computation that never |
8 | /// finishes. |
9 | /// |
10 | /// This `struct` is created by [`pending()`]. See its |
11 | /// documentation for more. |
12 | #[stable (feature = "future_readiness_fns" , since = "1.48.0" )] |
13 | #[must_use = "futures do nothing unless you `.await` or poll them" ] |
14 | pub struct Pending<T> { |
15 | _data: marker::PhantomData<fn() -> T>, |
16 | } |
17 | |
18 | /// Creates a future which never resolves, representing a computation that never |
19 | /// finishes. |
20 | /// |
21 | /// # Examples |
22 | /// |
23 | /// ```no_run |
24 | /// use std::future; |
25 | /// |
26 | /// # async fn run() { |
27 | /// let future = future::pending(); |
28 | /// let () = future.await; |
29 | /// unreachable!(); |
30 | /// # } |
31 | /// ``` |
32 | #[stable (feature = "future_readiness_fns" , since = "1.48.0" )] |
33 | pub fn pending<T>() -> Pending<T> { |
34 | Pending { _data: marker::PhantomData } |
35 | } |
36 | |
37 | #[stable (feature = "future_readiness_fns" , since = "1.48.0" )] |
38 | impl<T> Future for Pending<T> { |
39 | type Output = T; |
40 | |
41 | fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<T> { |
42 | Poll::Pending |
43 | } |
44 | } |
45 | |
46 | #[stable (feature = "future_readiness_fns" , since = "1.48.0" )] |
47 | impl<T> Debug for Pending<T> { |
48 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
49 | f.debug_struct(name:"Pending" ).finish() |
50 | } |
51 | } |
52 | |
53 | #[stable (feature = "future_readiness_fns" , since = "1.48.0" )] |
54 | impl<T> Clone for Pending<T> { |
55 | fn clone(&self) -> Self { |
56 | pending() |
57 | } |
58 | } |
59 | |