tuwunel_core/utils/stream/
try_broadband.rs1use futures::{TryFuture, TryStream, TryStreamExt, future::ready};
4
5use super::automatic_width;
6use crate::Result;
7
8pub trait TryBroadbandExt<T, E>
14where
15 Self: TryStream<Ok = T, Error = E, Item = Result<T, E>> + Send + Sized,
16{
17 fn broadn_try_all<F, Fut, N>(
24 self,
25 n: N,
26 f: F,
27 ) -> impl Future<Output = Result<bool, E>> + Send
28 where
29 N: Into<Option<usize>>,
30 F: Fn(Self::Ok) -> Fut + Send,
31 Fut: TryFuture<Ok = bool, Error = E, Output = Result<bool, E>> + Send;
32
33 fn broadn_try_any<F, Fut, N>(
40 self,
41 n: N,
42 f: F,
43 ) -> impl Future<Output = Result<bool, E>> + Send
44 where
45 N: Into<Option<usize>>,
46 F: Fn(Self::Ok) -> Fut + Send,
47 Fut: TryFuture<Ok = bool, Error = E, Output = Result<bool, E>> + Send;
48
49 fn broadn_and_then<U, F, Fut, N>(
56 self,
57 n: N,
58 f: F,
59 ) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
60 where
61 N: Into<Option<usize>>,
62 F: Fn(Self::Ok) -> Fut + Send,
63 Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send;
64
65 fn broad_try_all<F, Fut>(self, f: F) -> impl Future<Output = Result<bool, E>> + Send
71 where
72 F: Fn(Self::Ok) -> Fut + Send,
73 Fut: TryFuture<Ok = bool, Error = E, Output = Result<bool, E>> + Send,
74 {
75 self.broadn_try_all(None, f)
76 }
77
78 fn broad_try_any<F, Fut>(self, f: F) -> impl Future<Output = Result<bool, E>> + Send
84 where
85 F: Fn(Self::Ok) -> Fut + Send,
86 Fut: TryFuture<Ok = bool, Error = E, Output = Result<bool, E>> + Send,
87 {
88 self.broadn_try_any(None, f)
89 }
90
91 fn broad_and_then<U, F, Fut>(
97 self,
98 f: F,
99 ) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
100 where
101 F: Fn(Self::Ok) -> Fut + Send,
102 Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send,
103 {
104 self.broadn_and_then(None, f)
105 }
106}
107
108impl<T, E, S> TryBroadbandExt<T, E> for S
109where
110 S: TryStream<Ok = T, Error = E, Item = Result<T, E>> + Send + Sized,
111{
112 fn broadn_try_all<F, Fut, N>(self, n: N, f: F) -> impl Future<Output = Result<bool, E>> + Send
113 where
114 N: Into<Option<usize>>,
115 F: Fn(Self::Ok) -> Fut + Send,
116 Fut: TryFuture<Ok = bool, Error = E, Output = Result<bool, E>> + Send,
117 {
118 self.broadn_and_then(n, f).try_all(ready)
119 }
120
121 fn broadn_try_any<F, Fut, N>(self, n: N, f: F) -> impl Future<Output = Result<bool, E>> + Send
122 where
123 N: Into<Option<usize>>,
124 F: Fn(Self::Ok) -> Fut + Send,
125 Fut: TryFuture<Ok = bool, Error = E, Output = Result<bool, E>> + Send,
126 {
127 self.broadn_and_then(n, f).try_any(ready)
128 }
129
130 fn broadn_and_then<U, F, Fut, N>(
131 self,
132 n: N,
133 f: F,
134 ) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
135 where
136 N: Into<Option<usize>>,
137 F: Fn(Self::Ok) -> Fut + Send,
138 Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send,
139 {
140 self.map_ok(f)
141 .try_buffer_unordered(n.into().unwrap_or_else(automatic_width))
142 }
143}