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
//! Definition of `cloned!` macro. Proc-macros are defined in the separate `maple-core-macro` crate. /// Utility macro for cloning all the arguments and expanding the expression. /// /// Temporary workaround for [Rust RFC #2407](https://github.com/rust-lang/rfcs/issues/2407). /// /// # Example /// ``` /// use maple_core::prelude::*; /// /// let state = Signal::new(0); /// /// create_effect(cloned!((state) => move || { /// state.get(); /// })); /// /// // state still accessible outside of the effect /// let _ = state.get(); /// ``` #[macro_export] macro_rules! cloned { (($($arg:ident),*) => $e:expr) => {{ // clone all the args $( let $arg = ::std::clone::Clone::clone(&$arg); )* $e }}; } #[cfg(test)] mod tests { use crate::prelude::*; #[test] fn cloned() { let state = Signal::new(0); let _x = cloned!((state) => state); // state still accessible because it was cloned instead of moved let _ = state.get(); } #[test] fn cloned_closure() { let state = Signal::new(0); create_effect(cloned!((state) => move || { state.get(); })); // state still accessible outside of the effect let _ = state.get(); } }