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}