1 use crate::stream::StreamExt; 2 use core::pin::Pin; 3 use futures_core::future::{FusedFuture, Future}; 4 use futures_core::stream::{FusedStream, Stream}; 5 use futures_core::task::{Context, Poll}; 6 7 /// Future for the [`next`](super::StreamExt::next) method. 8 #[derive(Debug)] 9 #[must_use = "futures do nothing unless you `.await` or poll them"] 10 pub struct Next<'a, St: ?Sized> { 11 stream: &'a mut St, 12 } 13 14 impl<St: ?Sized + Unpin> Unpin for Next<'_, St> {} 15 16 impl<'a, St: ?Sized + Stream + Unpin> Next<'a, St> { new(stream: &'a mut St) -> Self17 pub(super) fn new(stream: &'a mut St) -> Self { 18 Self { stream } 19 } 20 } 21 22 impl<St: ?Sized + FusedStream + Unpin> FusedFuture for Next<'_, St> { is_terminated(&self) -> bool23 fn is_terminated(&self) -> bool { 24 self.stream.is_terminated() 25 } 26 } 27 28 impl<St: ?Sized + Stream + Unpin> Future for Next<'_, St> { 29 type Output = Option<St::Item>; 30 poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>31 fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { 32 self.stream.poll_next_unpin(cx) 33 } 34 } 35