1use super::Filter;
2
3pub trait WrapSealed<F: Filter> {
4 type Wrapped: Filter;
5
6 fn wrap(&self, filter: F) -> Self::Wrapped;
7}
8
9impl<'a, T, F> WrapSealed<F> for &'a T
10where
11 T: WrapSealed<F>,
12 F: Filter,
13{
14 type Wrapped = T::Wrapped;
15 fn wrap(&self, filter: F) -> Self::Wrapped {
16 (*self).wrap(filter)
17 }
18}
19
20pub trait Wrap<F: Filter>: WrapSealed<F> {}
21
22impl<T, F> Wrap<F> for T
23where
24 T: WrapSealed<F>,
25 F: Filter,
26{
27}
28
29pub fn wrap_fn<F, T, U>(func: F) -> WrapFn<F>
43where
44 F: Fn(T) -> U,
45 T: Filter,
46 U: Filter,
47{
48 WrapFn { func }
49}
50
51#[derive(Debug)]
52pub struct WrapFn<F> {
53 func: F,
54}
55
56impl<F, T, U> WrapSealed<T> for WrapFn<F>
57where
58 F: Fn(T) -> U,
59 T: Filter,
60 U: Filter,
61{
62 type Wrapped = U;
63
64 fn wrap(&self, filter: T) -> Self::Wrapped {
65 (self.func)(filter)
66 }
67}