use super::assert_sink; use crate::never::Never; use core::marker::PhantomData; use core::pin::Pin; use futures_core::task::{Context, Poll}; use futures_sink::Sink; /// Sink for the [`drain`] function. #[derive(Debug)] #[must_use = "sinks do nothing unless polled"] pub struct Drain { marker: PhantomData, } /// Create a sink that will just discard all items given to it. /// /// Similar to [`io::Sink`](::std::io::Sink). /// /// # Examples /// /// ``` /// # futures::executor::block_on(async { /// use futures::sink::{self, SinkExt}; /// /// let mut drain = sink::drain(); /// drain.send(5).await?; /// # Ok::<(), futures::never::Never>(()) }).unwrap(); /// ``` pub fn drain() -> Drain { assert_sink::(Drain { marker: PhantomData }) } impl Unpin for Drain {} impl Clone for Drain { fn clone(&self) -> Self { drain() } } impl Sink for Drain { type Error = Never; fn poll_ready(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { Poll::Ready(Ok(())) } fn start_send(self: Pin<&mut Self>, _item: T) -> Result<(), Self::Error> { Ok(()) } fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { Poll::Ready(Ok(())) } fn poll_close(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { Poll::Ready(Ok(())) } }