|  | use core::marker::PhantomData; | 
|  | use core::pin::Pin; | 
|  | use core::task::{Context, Poll}; | 
|  |  | 
|  | use crate::stream::{DoubleEndedStream, ExactSizeStream, FusedStream, Stream}; | 
|  |  | 
|  | /// A stream that never returns any items. | 
|  | /// | 
|  | /// This stream is created by the [`pending`] function. See its | 
|  | /// documentation for more. | 
|  | /// | 
|  | /// [`pending`]: fn.pending.html | 
|  | #[derive(Debug)] | 
|  | pub struct Pending<T> { | 
|  | _marker: PhantomData<T>, | 
|  | } | 
|  |  | 
|  | /// Creates a stream that never returns any items. | 
|  | /// | 
|  | /// The returned stream will always return `Pending` when polled. | 
|  | /// # Examples | 
|  | /// | 
|  | /// ``` | 
|  | /// # async_std::task::block_on(async { | 
|  | /// # | 
|  | /// use std::time::Duration; | 
|  | /// | 
|  | /// use async_std::prelude::*; | 
|  | /// use async_std::stream; | 
|  | /// | 
|  | /// let dur = Duration::from_millis(100); | 
|  | /// let mut s = stream::pending::<()>().timeout(dur); | 
|  | /// | 
|  | /// let item = s.next().await; | 
|  | /// | 
|  | /// assert!(item.is_some()); | 
|  | /// assert!(item.unwrap().is_err()); | 
|  | /// | 
|  | /// # | 
|  | /// # }) | 
|  | /// ``` | 
|  | pub fn pending<T>() -> Pending<T> { | 
|  | Pending { | 
|  | _marker: PhantomData, | 
|  | } | 
|  | } | 
|  |  | 
|  | impl<T> Stream for Pending<T> { | 
|  | type Item = T; | 
|  |  | 
|  | fn poll_next(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Option<T>> { | 
|  | Poll::Pending | 
|  | } | 
|  | } | 
|  |  | 
|  | impl<T> DoubleEndedStream for Pending<T> { | 
|  | fn poll_next_back(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Option<T>> { | 
|  | Poll::Pending | 
|  | } | 
|  | } | 
|  |  | 
|  | impl<T> FusedStream for Pending<T> {} | 
|  |  | 
|  | impl<T> ExactSizeStream for Pending<T> { | 
|  | fn len(&self) -> usize { | 
|  | 0 | 
|  | } | 
|  | } |