use crate::BufStream; use either::Either; use futures::{try_ready, Poll}; /// A buf stream that sequences two buf streams together. /// /// `Chain` values are produced by the `chain` function on `BufStream`. #[derive(Debug)] pub struct Chain { left: Option, right: U, } impl Chain { pub(crate) fn new(left: T, right: U) -> Chain { Chain { left: Some(left), right, } } } impl BufStream for Chain where T: BufStream, U: BufStream, { type Item = Either; type Error = T::Error; fn poll_buf(&mut self) -> Poll, Self::Error> { if let Some(ref mut stream) = self.left { let res = try_ready!(stream.poll_buf()); if res.is_some() { return Ok(res.map(Either::Left).into()); } } self.left = None; let res = try_ready!(self.right.poll_buf()); Ok(res.map(Either::Right).into()) } }