async_std/stream/
once.rs

1use core::pin::Pin;
2
3use pin_project_lite::pin_project;
4
5use crate::stream::Stream;
6use crate::task::{Context, Poll};
7
8#[cfg(feature = "unstable")]
9use crate::stream::DoubleEndedStream;
10
11/// Creates a stream that yields a single item.
12///
13/// # Examples
14///
15/// ```
16/// # async_std::task::block_on(async {
17/// #
18/// use async_std::prelude::*;
19/// use async_std::stream;
20///
21/// let mut s = stream::once(7);
22///
23/// assert_eq!(s.next().await, Some(7));
24/// assert_eq!(s.next().await, None);
25/// #
26/// # })
27/// ```
28pub fn once<T>(t: T) -> Once<T> {
29    Once { value: Some(t) }
30}
31
32pin_project! {
33    /// A stream that yields a single item.
34    ///
35    /// This stream is created by the [`once`] function. See its
36    /// documentation for more.
37    ///
38    /// [`once`]: fn.once.html
39    #[derive(Clone, Debug)]
40    pub struct Once<T> {
41        value: Option<T>,
42    }
43}
44
45impl<T> Stream for Once<T> {
46    type Item = T;
47
48    fn poll_next(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Option<T>> {
49        Poll::Ready(self.project().value.take())
50    }
51}
52
53#[cfg(feature = "unstable")]
54impl <T> DoubleEndedStream for Once<T> {
55    fn poll_next_back(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
56        Poll::Ready(self.project().value.take())
57    }
58}