1use crate::Stream;
2
3use core::pin::Pin;
4use core::task::{Context, Poll};
5
6#[derive(Debug)]
8#[must_use = "streams do nothing unless polled"]
9pub struct Once<T> {
10 value: Option<T>,
11}
12
13impl<I> Unpin for Once<I> {}
14
15pub fn once<T>(value: T) -> Once<T> {
36 Once { value: Some(value) }
37}
38
39impl<T> Stream for Once<T> {
40 type Item = T;
41
42 fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<T>> {
43 #[cfg(feature = "rt")]
44 {
45 use tokio::task::coop;
46
47 let coop = std::task::ready!(coop::poll_proceed(_cx));
48
49 coop.made_progress();
50 }
51
52 Poll::Ready(self.value.take())
53 }
54
55 fn size_hint(&self) -> (usize, Option<usize>) {
56 if self.value.is_some() {
57 (1, Some(1))
58 } else {
59 (0, Some(0))
60 }
61 }
62}