tuwunel_core/utils/stream/
try_wideband.rs1use futures::{TryFuture, TryStream, TryStreamExt};
4
5use super::automatic_width;
6use crate::Result;
7
8pub trait TryWidebandExt<T, E>
14where
15 Self: TryStream<Ok = T, Error = E, Item = Result<T, E>> + Send + Sized,
16{
17 fn widen_and_then<U, F, Fut, N>(
23 self,
24 n: N,
25 f: F,
26 ) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
27 where
28 N: Into<Option<usize>>,
29 F: Fn(Self::Ok) -> Fut + Send,
30 Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send,
31 U: Send;
32
33 fn wide_and_then<U, F, Fut>(
39 self,
40 f: F,
41 ) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
42 where
43 F: Fn(Self::Ok) -> Fut + Send,
44 Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send,
45 U: Send,
46 {
47 self.widen_and_then(None, f)
48 }
49}
50
51impl<T, E, S> TryWidebandExt<T, E> for S
52where
53 S: TryStream<Ok = T, Error = E, Item = Result<T, E>> + Send + Sized,
54 E: Send,
55{
56 fn widen_and_then<U, F, Fut, N>(
57 self,
58 n: N,
59 f: F,
60 ) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
61 where
62 N: Into<Option<usize>>,
63 F: Fn(Self::Ok) -> Fut + Send,
64 Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send,
65 U: Send,
66 {
67 self.map_ok(f)
68 .try_buffered(n.into().unwrap_or_else(automatic_width))
69 }
70}