| use crate::{Iter, Stream}; |
| |
| use core::option; |
| use core::pin::Pin; |
| use core::task::{Context, Poll}; |
| |
| /// Stream for the [`once`](fn@once) function. |
| #[derive(Debug)] |
| #[must_use = "streams do nothing unless polled"] |
| pub struct Once<T> { |
| iter: Iter<option::IntoIter<T>>, |
| } |
| |
| impl<I> Unpin for Once<I> {} |
| |
| /// Creates a stream that emits an element exactly once. |
| /// |
| /// The returned stream is immediately ready and emits the provided value once. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// use tokio_stream::{self as stream, StreamExt}; |
| /// |
| /// #[tokio::main] |
| /// async fn main() { |
| /// // one is the loneliest number |
| /// let mut one = stream::once(1); |
| /// |
| /// assert_eq!(Some(1), one.next().await); |
| /// |
| /// // just one, that's all we get |
| /// assert_eq!(None, one.next().await); |
| /// } |
| /// ``` |
| pub fn once<T>(value: T) -> Once<T> { |
| Once { |
| iter: crate::iter(Some(value).into_iter()), |
| } |
| } |
| |
| impl<T> Stream for Once<T> { |
| type Item = T; |
| |
| fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<T>> { |
| Pin::new(&mut self.iter).poll_next(cx) |
| } |
| |
| fn size_hint(&self) -> (usize, Option<usize>) { |
| self.iter.size_hint() |
| } |
| } |