1macro_rules! impl_closure_trait {
71 (@into_once_fn_method $once_type:ident, ($($generics:ident),*)) => {
75 fn into_once(self) -> $once_type<$($generics),*>
76 where
77 Self: Sized + 'static,
78 $($generics: 'static,)*
79 {
80 $once_type::new(self)
81 }
82 };
83
84 (@into_once_fnmut_method $once_type:ident, ($($generics:ident),*), ($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?) => {
86 fn into_once(mut self) -> $once_type<$($generics),*>
87 where
88 Self: Sized + 'static,
89 $($generics: 'static,)*
90 {
91 $once_type::new(move |$($arg: $arg_ty),*| self($($arg),*))
92 }
93 };
94
95 (@to_once_fn_method $once_type:ident, ($($generics:ident),*)) => {
99 fn to_once(&self) -> $once_type<$($generics),*>
100 where
101 Self: Clone + Sized + 'static,
102 $($generics: 'static,)*
103 {
104 $once_type::new(self.clone())
105 }
106 };
107
108 (@to_once_fnmut_method $once_type:ident, ($($generics:ident),*), ($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?) => {
110 fn to_once(&self) -> $once_type<$($generics),*>
111 where
112 Self: Clone + Sized + 'static,
113 $($generics: 'static,)*
114 {
115 let mut cloned = self.clone();
116 $once_type::new(move |$($arg: $arg_ty),*| cloned($($arg),*))
117 }
118 };
119
120 (
123 @impl_common_fn
124 $trait_name:ident < $($generics:ident),* >,
125 $method_name:ident,
126 $closure_trait:path,
127 ($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?
128 ) => {
129 fn $method_name(&self, $($arg: $arg_ty),*) $(-> $ret)? {
131 self($($arg),*)
132 }
133
134 fn into_box(self) -> paste::paste! { [<Box $trait_name>] < $($generics),* > }
137 where
138 Self: Sized + 'static,
139 {
140 paste::paste! { [<Box $trait_name>]::new(self) }
141 }
142
143 fn into_rc(self) -> paste::paste! { [<Rc $trait_name>] < $($generics),* > }
144 where
145 Self: Sized + 'static,
146 {
147 paste::paste! { [<Rc $trait_name>]::new(self) }
148 }
149
150 fn into_fn(self) -> impl $closure_trait
151 where
152 Self: Sized + 'static,
153 {
154 self
155 }
156
157 fn into_arc(self) -> paste::paste! { [<Arc $trait_name>] < $($generics),* > }
159 where
160 Self: Sized + Send + Sync + 'static,
161 $($generics: 'static,)*
162 {
163 paste::paste! { [<Arc $trait_name>]::new(self) }
164 }
165
166 fn to_box(&self) -> paste::paste! { [<Box $trait_name>] < $($generics),* > }
169 where
170 Self: Clone + Sized + 'static,
171 {
172 paste::paste! { [<Box $trait_name>]::new(self.clone()) }
173 }
174
175 fn to_rc(&self) -> paste::paste! { [<Rc $trait_name>] < $($generics),* > }
176 where
177 Self: Clone + Sized + 'static,
178 {
179 paste::paste! { [<Rc $trait_name>]::new(self.clone()) }
180 }
181
182 fn to_fn(&self) -> impl $closure_trait
183 where
184 Self: Clone + Sized + 'static,
185 {
186 self.clone()
187 }
188
189 fn to_arc(&self) -> paste::paste! { [<Arc $trait_name>] < $($generics),* > }
191 where
192 Self: Clone + Sized + Send + Sync + 'static,
193 $($generics: 'static,)*
194 {
195 paste::paste! { [<Arc $trait_name>]::new(self.clone()) }
196 }
197 };
198
199 (
202 @impl_common_fnmut
203 $trait_name:ident < $($generics:ident),* >,
204 $method_name:ident,
205 $closure_trait:path,
206 ($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?
207 ) => {
208 fn $method_name(&mut self, $($arg: $arg_ty),*) $(-> $ret)? {
210 self($($arg),*)
211 }
212
213 fn into_box(self) -> paste::paste! { [<Box $trait_name>] < $($generics),* > }
216 where
217 Self: Sized + 'static,
218 {
219 paste::paste! { [<Box $trait_name>]::new(self) }
220 }
221
222 fn into_rc(self) -> paste::paste! { [<Rc $trait_name>] < $($generics),* > }
223 where
224 Self: Sized + 'static,
225 {
226 paste::paste! { [<Rc $trait_name>]::new(self) }
227 }
228
229 fn into_fn(self) -> impl $closure_trait
230 where
231 Self: Sized + 'static,
232 {
233 self
234 }
235
236 fn into_arc(self) -> paste::paste! { [<Arc $trait_name>] < $($generics),* > }
238 where
239 Self: Sized + Send + 'static,
240 $($generics: 'static,)*
241 {
242 paste::paste! { [<Arc $trait_name>]::new(self) }
243 }
244
245 fn to_box(&self) -> paste::paste! { [<Box $trait_name>] < $($generics),* > }
248 where
249 Self: Clone + Sized + 'static,
250 {
251 paste::paste! { [<Box $trait_name>]::new(self.clone()) }
252 }
253
254 fn to_rc(&self) -> paste::paste! { [<Rc $trait_name>] < $($generics),* > }
255 where
256 Self: Clone + Sized + 'static,
257 {
258 paste::paste! { [<Rc $trait_name>]::new(self.clone()) }
259 }
260
261 fn to_fn(&self) -> impl $closure_trait
262 where
263 Self: Clone + Sized + 'static,
264 {
265 self.clone()
266 }
267
268 fn to_arc(&self) -> paste::paste! { [<Arc $trait_name>] < $($generics),* > }
270 where
271 Self: Clone + Sized + Send + 'static,
272 $($generics: 'static,)*
273 {
274 let cloned = self.clone();
275 paste::paste! { [<Arc $trait_name>]::new(cloned) }
276 }
277 };
278
279
280 (
284 $trait_name:ident < $($generics:ident),* >,
285 $method_name:ident,
286 $once_type:ident,
287 Fn($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?
288 ) => {
289 impl<$($generics,)* F> $trait_name<$($generics),*> for F
290 where
291 F: Fn($($arg_ty),*) $(-> $ret)?,
292 $($generics: 'static,)*
293 {
294 impl_closure_trait!(
296 @impl_common_fn
297 $trait_name<$($generics),*>,
298 $method_name,
299 Fn($($arg_ty),*) $(-> $ret)?,
300 ($($arg : $arg_ty),*) $(-> $ret)?
301 );
302
303 impl_closure_trait!(@into_once_fn_method $once_type, ($($generics),*));
305 impl_closure_trait!(@to_once_fn_method $once_type, ($($generics),*));
306 }
307 };
308
309 (
311 $trait_name:ident < $($generics:ident),* >,
312 $method_name:ident,
313 Fn($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?
314 ) => {
315 impl<$($generics,)* F> $trait_name<$($generics),*> for F
316 where
317 F: Fn($($arg_ty),*) $(-> $ret)?,
318 $($generics: 'static,)*
319 {
320 impl_closure_trait!(
322 @impl_common_fn
323 $trait_name<$($generics),*>,
324 $method_name,
325 Fn($($arg_ty),*) $(-> $ret)?,
326 ($($arg : $arg_ty),*) $(-> $ret)?
327 );
328 }
329 };
330
331 (
333 $trait_name:ident < $($generics:ident),* >,
334 $method_name:ident,
335 $once_type:ident,
336 FnMut($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?
337 ) => {
338 impl<$($generics,)* F> $trait_name<$($generics),*> for F
339 where
340 F: FnMut($($arg_ty),*) $(-> $ret)?,
341 $($generics: 'static,)*
342 {
343 impl_closure_trait!(
345 @impl_common_fnmut
346 $trait_name<$($generics),*>,
347 $method_name,
348 FnMut($($arg_ty),*) $(-> $ret)?,
349 ($($arg : $arg_ty),*) $(-> $ret)?
350 );
351
352 impl_closure_trait!(@into_once_fnmut_method $once_type, ($($generics),*), ($($arg : $arg_ty),*) $(-> $ret)?);
354 impl_closure_trait!(@to_once_fnmut_method $once_type, ($($generics),*), ($($arg : $arg_ty),*) $(-> $ret)?);
355 }
356 };
357
358 (
360 $trait_name:ident < $($generics:ident),* >,
361 $method_name:ident,
362 FnMut($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?
363 ) => {
364 impl<$($generics,)* F> $trait_name<$($generics),*> for F
365 where
366 F: FnMut($($arg_ty),*) $(-> $ret)?,
367 $($generics: 'static,)*
368 {
369 impl_closure_trait!(
371 @impl_common_fnmut
372 $trait_name<$($generics),*>,
373 $method_name,
374 FnMut($($arg_ty),*) $(-> $ret)?,
375 ($($arg : $arg_ty),*) $(-> $ret)?
376 );
377 }
378 };
379}
380
381pub(crate) use impl_closure_trait;