rust_overture/
setter.rs

1/// Internal boxed version (hidden in module normally)
2fn 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
9/// Public API: takes plain closures (Fn)
10pub 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
24/// Internal boxed version
25fn 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
38/// Public API: takes plain value
39pub 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
52/// Internal boxed version
53fn 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
64/// Public API: takes plain FnMut
65pub 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
77/// Internal boxed version
78fn 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
89/// Public API: takes plain value
90pub 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}