qubit_function/functions/stateful_mutating_function/
arc_stateful_mutating_function.rs1use super::{
14 Arc,
15 ArcConditionalStatefulMutatingFunction,
16 ArcStatefulMutatingFunctionFn,
17 BoxMutatingFunctionOnce,
18 BoxStatefulMutatingFunction,
19 Function,
20 Mutex,
21 Predicate,
22 RcStatefulMutatingFunction,
23 StatefulMutatingFunction,
24 impl_arc_conversions,
25 impl_function_clone,
26 impl_function_common_methods,
27 impl_function_debug_display,
28 impl_function_identity_method,
29 impl_shared_function_methods,
30};
31
32pub struct ArcStatefulMutatingFunction<T, R> {
79 pub(super) function: ArcStatefulMutatingFunctionFn<T, R>,
80 pub(super) name: Option<String>,
81}
82
83impl<T, R> ArcStatefulMutatingFunction<T, R> {
84 impl_function_common_methods!(
86 ArcStatefulMutatingFunction<T, R>,
87 (FnMut(&mut T) -> R + Send + 'static),
88 |f| Arc::new(Mutex::new(f))
89 );
90
91 impl_shared_function_methods!(
93 ArcStatefulMutatingFunction<T, R>,
94 ArcConditionalStatefulMutatingFunction,
95 into_arc,
96 Function, Send + Sync + 'static
98 );
99}
100
101impl_function_clone!(ArcStatefulMutatingFunction<T, R>);
103
104impl_function_debug_display!(ArcStatefulMutatingFunction<T, R>);
106
107impl_function_identity_method!(ArcStatefulMutatingFunction<T, T>, mutating);
109
110impl<T, R> StatefulMutatingFunction<T, R> for ArcStatefulMutatingFunction<T, R> {
112 fn apply(&mut self, t: &mut T) -> R {
113 (self.function.lock())(t)
114 }
115
116 impl_arc_conversions!(
118 ArcStatefulMutatingFunction<T, R>,
119 BoxStatefulMutatingFunction,
120 RcStatefulMutatingFunction,
121 BoxMutatingFunctionOnce,
122 FnMut(input: &mut T) -> R
123 );
124}
125
126impl<T, R, F> StatefulMutatingFunction<T, R> for F
131where
132 F: FnMut(&mut T) -> R,
133{
134 fn apply(&mut self, input: &mut T) -> R {
135 self(input)
136 }
137
138 fn into_box(self) -> BoxStatefulMutatingFunction<T, R>
139 where
140 Self: Sized + 'static,
141 {
142 BoxStatefulMutatingFunction::new(self)
143 }
144
145 fn into_rc(self) -> RcStatefulMutatingFunction<T, R>
146 where
147 Self: Sized + 'static,
148 {
149 RcStatefulMutatingFunction::new(self)
150 }
151
152 fn into_arc(self) -> ArcStatefulMutatingFunction<T, R>
153 where
154 Self: Sized + Send + 'static,
155 {
156 ArcStatefulMutatingFunction::new(self)
157 }
158
159 fn into_fn(self) -> impl FnMut(&mut T) -> R
160 where
161 Self: Sized + 'static,
162 {
163 self
164 }
165
166 fn to_box(&self) -> BoxStatefulMutatingFunction<T, R>
167 where
168 Self: Sized + Clone + 'static,
169 {
170 let cloned = self.clone();
171 BoxStatefulMutatingFunction::new(cloned)
172 }
173
174 fn to_rc(&self) -> RcStatefulMutatingFunction<T, R>
175 where
176 Self: Sized + Clone + 'static,
177 {
178 let cloned = self.clone();
179 RcStatefulMutatingFunction::new(cloned)
180 }
181
182 fn to_arc(&self) -> ArcStatefulMutatingFunction<T, R>
183 where
184 Self: Sized + Clone + Send + 'static,
185 {
186 let cloned = self.clone();
187 ArcStatefulMutatingFunction::new(cloned)
188 }
189
190 fn to_fn(&self) -> impl FnMut(&mut T) -> R
191 where
192 Self: Sized + Clone + 'static,
193 {
194 self.clone()
195 }
196
197 fn into_once(self) -> BoxMutatingFunctionOnce<T, R>
198 where
199 Self: Sized + 'static,
200 {
201 BoxMutatingFunctionOnce::new(self)
202 }
203
204 fn to_once(&self) -> BoxMutatingFunctionOnce<T, R>
205 where
206 Self: Sized + Clone + 'static,
207 {
208 BoxMutatingFunctionOnce::new(self.clone())
209 }
210}