Skip to main content

tuwunel_core/utils/future/
option_stream.rs

1use futures::{Future, FutureExt, Stream, StreamExt, future::OptionFuture};
2
3use super::super::IterStream;
4
5pub trait OptionStream<T> {
6	fn stream(self) -> impl Stream<Item = T> + Send;
7}
8
9impl<T, O, S, Fut> OptionStream<T> for OptionFuture<Fut>
10where
11	Fut: Future<Output = (O, S)> + Send,
12	S: Stream<Item = T> + Send,
13	O: IntoIterator<Item = T> + Send,
14	<O as IntoIterator>::IntoIter: Send,
15	T: Send,
16{
17	#[inline]
18	fn stream(self) -> impl Stream<Item = T> + Send {
19		self.map(|opt| opt.map(|(curr, next)| curr.into_iter().stream().chain(next)))
20			.map(Option::into_iter)
21			.map(IterStream::stream)
22			.flatten_stream()
23			.flatten()
24	}
25}