Skip to main content

sendwrap_fn/
sendwrap_fn.rs

1/// Macro to wrap closures with `send_wrapper::SendWrapper`.
2///
3/// ## Usage
4///
5/// ```
6/// # use sendwrap_fn::sendwrap_fn;
7///
8/// let wrapped = sendwrap_fn!(move |a: i32, b: i32| { /* do stuff */ });
9/// ```
10///
11/// For closures that implement only `FnOnce`:
12///
13/// ```
14/// # use sendwrap_fn::sendwrap_fn;
15///
16/// let wrapped = sendwrap_fn!(once move || { /* do stuff */ });
17/// ```
18#[macro_export]
19macro_rules! sendwrap_fn {
20    (move |$($param:ident : $ty:ty),*| $($content:tt)*) => {
21        {
22            let wrapped = $crate::__private::SendWrapper::new(move |$($param : $ty),*| $($content)*);
23
24            move |$($param : $ty),*| wrapped($($param),*)
25        }
26    };
27
28    (once move |$($param:ident : $ty:ty),*| $($content:tt)*) => {
29        {
30            let wrapped = $crate::__private::SendWrapper::new(move |$($param : $ty),*| $($content)*);
31
32            move |$($param : $ty),*| {
33                let inner = wrapped.take();
34                inner($($param),*)
35            }
36        }
37    };
38
39    (move |$($param:ident),*| $($content:tt)*) => {
40        {
41            let wrapped = $crate::__private::SendWrapper::new(move |$($param),*| $($content)*);
42
43            move |$($param),*| wrapped($($param),*)
44        }
45    };
46
47    (once move |$($param:ident),*| $($content:tt)*) => {
48        {
49            let wrapped = $crate::__private::SendWrapper::new(move |$($param),*| $($content)*);
50
51            move |$($param),*| {
52                let inner = wrapped.take();
53                inner($($param),*)
54            }
55        }
56    };
57
58    (once move || $($content:tt)*) => {
59        $crate::sendwrap_fn!(once move | | $($content)*)
60    };
61
62    (move || $($content:tt)*) => {
63        $crate::sendwrap_fn!(move | | $($content)*)
64    };
65}