1macro_rules! impl_closure_trait {
71 (@into_once_fn_method $once_type:ident, ($($generics:ident),*)) => {
75 #[inline]
76 fn into_once(self) -> $once_type<$($generics),*>
77 where
78 Self: Sized + '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 #[inline]
87 fn into_once(mut self) -> $once_type<$($generics),*>
88 where
89 Self: Sized + '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 #[inline]
100 fn to_once(&self) -> $once_type<$($generics),*>
101 where
102 Self: Clone + Sized + '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 #[inline]
111 fn to_once(&self) -> $once_type<$($generics),*>
112 where
113 Self: Clone + Sized + '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 #[inline]
131 fn $method_name(&self, $($arg: $arg_ty),*) $(-> $ret)? {
132 self($($arg),*)
133 }
134
135 #[inline]
138 fn into_box(self) -> paste::paste! { [<Box $trait_name>] < $($generics),* > }
139 where
140 Self: Sized + 'static,
141 {
142 paste::paste! { [<Box $trait_name>]::new(self) }
143 }
144
145 #[inline]
146 fn into_rc(self) -> paste::paste! { [<Rc $trait_name>] < $($generics),* > }
147 where
148 Self: Sized + 'static,
149 {
150 paste::paste! { [<Rc $trait_name>]::new(self) }
151 }
152
153 #[inline]
154 fn into_fn(self) -> impl $closure_trait
155 where
156 Self: Sized + 'static,
157 {
158 self
159 }
160
161 #[inline]
163 fn into_arc(self) -> paste::paste! { [<Arc $trait_name>] < $($generics),* > }
164 where
165 Self: Sized + Send + Sync + 'static,
166 {
167 paste::paste! { [<Arc $trait_name>]::new(self) }
168 }
169
170 #[inline]
173 fn to_box(&self) -> paste::paste! { [<Box $trait_name>] < $($generics),* > }
174 where
175 Self: Clone + Sized + 'static,
176 {
177 paste::paste! { [<Box $trait_name>]::new(self.clone()) }
178 }
179
180 #[inline]
181 fn to_rc(&self) -> paste::paste! { [<Rc $trait_name>] < $($generics),* > }
182 where
183 Self: Clone + Sized + 'static,
184 {
185 paste::paste! { [<Rc $trait_name>]::new(self.clone()) }
186 }
187
188 #[inline]
189 fn to_fn(&self) -> impl $closure_trait
190 where
191 Self: Clone + Sized + 'static,
192 {
193 self.clone()
194 }
195
196 #[inline]
198 fn to_arc(&self) -> paste::paste! { [<Arc $trait_name>] < $($generics),* > }
199 where
200 Self: Clone + Sized + Send + Sync + 'static,
201 {
202 paste::paste! { [<Arc $trait_name>]::new(self.clone()) }
203 }
204 };
205
206 (
209 @impl_common_fnmut
210 $trait_name:ident < $($generics:ident),* >,
211 $method_name:ident,
212 $closure_trait:path,
213 ($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?
214 ) => {
215 #[inline]
217 fn $method_name(&mut self, $($arg: $arg_ty),*) $(-> $ret)? {
218 self($($arg),*)
219 }
220
221 #[inline]
224 fn into_box(self) -> paste::paste! { [<Box $trait_name>] < $($generics),* > }
225 where
226 Self: Sized + 'static,
227 {
228 paste::paste! { [<Box $trait_name>]::new(self) }
229 }
230
231 #[inline]
232 fn into_rc(self) -> paste::paste! { [<Rc $trait_name>] < $($generics),* > }
233 where
234 Self: Sized + 'static,
235 {
236 paste::paste! { [<Rc $trait_name>]::new(self) }
237 }
238
239 #[inline]
240 fn into_fn(self) -> impl $closure_trait
241 where
242 Self: Sized + 'static,
243 {
244 self
245 }
246
247 #[inline]
249 fn into_arc(self) -> paste::paste! { [<Arc $trait_name>] < $($generics),* > }
250 where
251 Self: Sized + Send + 'static,
252 {
253 paste::paste! { [<Arc $trait_name>]::new(self) }
254 }
255
256 #[inline]
259 fn to_box(&self) -> paste::paste! { [<Box $trait_name>] < $($generics),* > }
260 where
261 Self: Clone + Sized + 'static,
262 {
263 paste::paste! { [<Box $trait_name>]::new(self.clone()) }
264 }
265
266 #[inline]
267 fn to_rc(&self) -> paste::paste! { [<Rc $trait_name>] < $($generics),* > }
268 where
269 Self: Clone + Sized + 'static,
270 {
271 paste::paste! { [<Rc $trait_name>]::new(self.clone()) }
272 }
273
274 #[inline]
275 fn to_fn(&self) -> impl $closure_trait
276 where
277 Self: Clone + Sized + 'static,
278 {
279 self.clone()
280 }
281
282 #[inline]
284 fn to_arc(&self) -> paste::paste! { [<Arc $trait_name>] < $($generics),* > }
285 where
286 Self: Clone + Sized + Send + 'static,
287 {
288 let cloned = self.clone();
289 paste::paste! { [<Arc $trait_name>]::new(cloned) }
290 }
291 };
292
293
294 (
298 $trait_name:ident < $($generics:ident),* >,
299 $method_name:ident,
300 $once_type:ident,
301 Fn($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?
302 ) => {
303 impl<$($generics,)* F> $trait_name<$($generics),*> for F
304 where
305 F: Fn($($arg_ty),*) $(-> $ret)?,
306 {
307 impl_closure_trait!(
309 @impl_common_fn
310 $trait_name<$($generics),*>,
311 $method_name,
312 Fn($($arg_ty),*) $(-> $ret)?,
313 ($($arg : $arg_ty),*) $(-> $ret)?
314 );
315
316 impl_closure_trait!(@into_once_fn_method $once_type, ($($generics),*));
318 impl_closure_trait!(@to_once_fn_method $once_type, ($($generics),*));
319 }
320 };
321
322 (
324 $trait_name:ident < $($generics:ident),* >,
325 $method_name:ident,
326 Fn($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?
327 ) => {
328 impl<$($generics,)* F> $trait_name<$($generics),*> for F
329 where
330 F: Fn($($arg_ty),*) $(-> $ret)?,
331 {
332 impl_closure_trait!(
334 @impl_common_fn
335 $trait_name<$($generics),*>,
336 $method_name,
337 Fn($($arg_ty),*) $(-> $ret)?,
338 ($($arg : $arg_ty),*) $(-> $ret)?
339 );
340 }
341 };
342
343 (
345 $trait_name:ident < $($generics:ident),* >,
346 $method_name:ident,
347 $once_type:ident,
348 FnMut($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?
349 ) => {
350 impl<$($generics,)* F> $trait_name<$($generics),*> for F
351 where
352 F: FnMut($($arg_ty),*) $(-> $ret)?,
353 {
354 impl_closure_trait!(
356 @impl_common_fnmut
357 $trait_name<$($generics),*>,
358 $method_name,
359 FnMut($($arg_ty),*) $(-> $ret)?,
360 ($($arg : $arg_ty),*) $(-> $ret)?
361 );
362
363 impl_closure_trait!(@into_once_fnmut_method $once_type, ($($generics),*), ($($arg : $arg_ty),*) $(-> $ret)?);
365 impl_closure_trait!(@to_once_fnmut_method $once_type, ($($generics),*), ($($arg : $arg_ty),*) $(-> $ret)?);
366 }
367 };
368
369 (
371 $trait_name:ident < $($generics:ident),* >,
372 $method_name:ident,
373 FnMut($($arg:ident : $arg_ty:ty),*) $(-> $ret:ty)?
374 ) => {
375 impl<$($generics,)* F> $trait_name<$($generics),*> for F
376 where
377 F: FnMut($($arg_ty),*) $(-> $ret)?,
378 {
379 impl_closure_trait!(
381 @impl_common_fnmut
382 $trait_name<$($generics),*>,
383 $method_name,
384 FnMut($($arg_ty),*) $(-> $ret)?,
385 ($($arg : $arg_ty),*) $(-> $ret)?
386 );
387 }
388 };
389}
390
391pub(crate) use impl_closure_trait;