1fn over_boxed<S, T, A, B>(
3 setter: impl Fn(Box<dyn Fn(A) -> B>) -> Box<dyn Fn(S) -> T>,
4 f: Box<dyn Fn(A) -> B>,
5) -> Box<dyn Fn(S) -> T> {
6 setter(f)
7}
8
9pub fn over<S, T, A, B, F>(
11 setter: impl Fn(Box<dyn Fn(A) -> B>) -> Box<dyn Fn(S) -> T>,
12 f: F,
13) -> Box<dyn Fn(S) -> T>
14where
15 S: 'static,
16 T: 'static,
17 A: 'static,
18 B: 'static,
19 F: Fn(A) -> B + 'static,
20{
21 over_boxed(setter, Box::new(f))
22}
23
24fn set_boxed<S, T, A, B>(
26 setter: impl Fn(Box<dyn Fn(A) -> B>) -> Box<dyn Fn(S) -> T>,
27 value: B,
28) -> Box<dyn Fn(S) -> T>
29where
30 S: 'static,
31 T: 'static,
32 A: 'static,
33 B: Clone + 'static,
34{
35 over_boxed(setter, Box::new(move |_| value.clone()))
36}
37
38pub fn set<S, T, A, B>(
40 setter: impl Fn(Box<dyn Fn(A) -> B>) -> Box<dyn Fn(S) -> T>,
41 value: B,
42) -> Box<dyn Fn(S) -> T>
43where
44 S: 'static,
45 T: 'static,
46 A: 'static,
47 B: Clone + 'static,
48{
49 set_boxed(setter, value)
50}
51
52fn mver_boxed<S, A>(
54 setter: impl Fn(Box<dyn FnMut(&mut A)>) -> Box<dyn FnMut(&mut S)>,
55 f: Box<dyn FnMut(&mut A)>,
56) -> Box<dyn FnMut(&mut S)>
57where
58 S: 'static,
59 A: 'static,
60{
61 setter(f)
62}
63
64pub fn mver<S, A, F>(
66 setter: impl Fn(Box<dyn FnMut(&mut A)>) -> Box<dyn FnMut(&mut S)>,
67 f: F,
68) -> Box<dyn FnMut(&mut S)>
69where
70 S: 'static,
71 A: 'static,
72 F: FnMut(&mut A) + 'static,
73{
74 mver_boxed(setter, Box::new(f))
75}
76
77fn mset_boxed<S, A>(
79 setter: impl Fn(Box<dyn FnMut(&mut A)>) -> Box<dyn FnMut(&mut S)>,
80 value: A,
81) -> Box<dyn FnMut(&mut S)>
82where
83 S: 'static,
84 A: Clone + 'static,
85{
86 mver_boxed(setter, Box::new(move |a: &mut A| *a = value.clone()))
87}
88
89pub fn mset<S, A>(
91 setter: impl Fn(Box<dyn FnMut(&mut A)>) -> Box<dyn FnMut(&mut S)>,
92 value: A,
93) -> Box<dyn FnMut(&mut S)>
94where
95 S: 'static,
96 A: Clone + 'static,
97{
98 mset_boxed(setter, value)
99}
100
101
102#[macro_export]
103macro_rules! over {
104 ($setter:expr, $f:expr) => {
105 $crate::over($setter, $f)
106 };
107}
108
109#[macro_export]
110macro_rules! set_macro {
111 ($setter:expr, $value:expr) => {
112 $crate::set($setter, $value)
113 };
114}
115
116#[macro_export]
117macro_rules! mver_macro {
118 ($setter:expr, $f:expr) => {
119 $crate::mver($setter, $f)
120 };
121}
122
123#[macro_export]
124macro_rules! mset_macro {
125 ($setter:expr, $value:expr) => {
126 $crate::mset($setter, $value)
127 };
128}