Skip to main content

tuwunel_core/utils/stream/
iter_stream.rs

1use futures::{
2	StreamExt, stream,
3	stream::{Stream, TryStream},
4};
5
6use crate::{Error, Result};
7
8pub trait IterStream<I: IntoIterator + Send> {
9	/// Convert an Iterator into a Stream
10	fn stream(self) -> impl Stream<Item = <I as IntoIterator>::Item> + Send;
11
12	/// Convert an Iterator into a TryStream
13	fn try_stream(
14		self,
15	) -> impl TryStream<
16		Ok = <I as IntoIterator>::Item,
17		Error = Error,
18		Item = Result<<I as IntoIterator>::Item, Error>,
19	> + Send;
20}
21
22impl<I> IterStream<I> for I
23where
24	I: IntoIterator + Send,
25	<I as IntoIterator>::IntoIter: Send,
26{
27	#[inline]
28	fn stream(self) -> impl Stream<Item = <I as IntoIterator>::Item> + Send { stream::iter(self) }
29
30	#[inline]
31	fn try_stream(
32		self,
33	) -> impl TryStream<
34		Ok = <I as IntoIterator>::Item,
35		Error = Error,
36		Item = Result<<I as IntoIterator>::Item, Error>,
37	> + Send {
38		self.stream().map(Ok)
39	}
40}