leptos_use/utils/
sendwrap_fn.rs

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

            move |$($param : $ty),*| wrapped($($param),*)
        }
    };

    (once move |$($param:ident : $ty:ty),*| $($content:tt)*) => {
        {
            let wrapped = send_wrapper::SendWrapper::new(move |$($param : $ty),*| $($content)*);

            move |$($param : $ty),*| {
                let inner = wrapped.take();
                inner($($param),*)
            }
        }
    };

    (move |$($param:ident),*| $($content:tt)*) => {
        {
            let wrapped = send_wrapper::SendWrapper::new(move |$($param),*| $($content)*);

            move |$($param),*| wrapped($($param),*)
        }
    };

    (once move |$($param:ident),*| $($content:tt)*) => {
        {
            let wrapped = send_wrapper::SendWrapper::new(move |$($param),*| $($content)*);

            move |$($param),*| {
                let inner = wrapped.take();
                inner($($param),*)
            }
        }
    };

    (once move || $($content:tt)*) => {
        sendwrap_fn!(once move | | $($content)*)
    };

    (move || $($content:tt)*) => {
        sendwrap_fn!(move | | $($content)*)
    };
}