use crate::stream::{Fuse, Stream}; use core::pin::Pin; use core::task::{Context, Poll}; use pin_project_lite::pin_project; pin_project! { /// Stream returned by the [`chain`](super::StreamExt::chain) method. pub struct Chain { #[pin] a: Fuse, #[pin] b: U, } } impl Chain { pub(super) fn new(a: T, b: U) -> Chain where T: Stream, U: Stream, { Chain { a: Fuse::new(a), b } } } impl Stream for Chain where T: Stream, U: Stream, { type Item = T::Item; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { use Poll::Ready; let me = self.project(); if let Some(v) = ready!(me.a.poll_next(cx)) { return Ready(Some(v)); } me.b.poll_next(cx) } fn size_hint(&self) -> (usize, Option) { super::merge_size_hints(self.a.size_hint(), self.b.size_hint()) } }