appy/utils/with_clone.rs
1/// Clone variables for closure.
2///
3/// Convenience macro for cloning variables, especially intended to be used
4/// in closures. For example, the following:
5/// ```rust
6/// use appy::with_clone;
7/// let a=1;
8/// let b=2;
9/// with_clone!([a,b],||{
10/// // ..
11/// });
12/// ```
13/// Will expand to:
14/// ```rust
15/// use appy::with_clone;
16/// let a=1;
17/// let b=2;
18/// {
19/// let a=a.clone();
20/// let b=b.clone();
21/// ||{
22/// // ..
23/// }
24/// };
25/// ```
26#[macro_export]
27macro_rules! with_clone {
28 ([$ ($var:ident), *],$body:expr) => {
29 {
30 $(let $var=($var).clone();)*
31 $body
32 }
33 }
34}
35
36/// Clone variables for closure, and create Rc.
37///
38/// Does the same as [with_clone], and then also applies `Rc::new`
39/// on the result.
40#[macro_export]
41macro_rules! rc_with_clone {
42 ($args:tt,$body:expr) => {{
43 std::rc::Rc::new($crate::with_clone!($args, $body))
44 }};
45}