From 6100023a2ad7ceface0065485b48f49b70991a30 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Thu, 14 Aug 2025 05:01:03 +0200 Subject: [PATCH] Added a run macro with useEffect like properties #30 --- examples/iter.rs | 13 +++++-------- src/macros.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/examples/iter.rs b/examples/iter.rs index 8da4782..230f030 100644 --- a/examples/iter.rs +++ b/examples/iter.rs @@ -11,21 +11,18 @@ fn main() -> std::io::Result<()> { pub fn app() -> Rsx { let items: State> = use_state(vec![1, 2]); - std::thread::spawn({ - let items = items.clone(); - move || { - std::thread::sleep(std::time::Duration::from_millis(1000)); + run! { + use items + { + std::thread::sleep(std::time::Duration::from_millis(300)); items.get().push(3); - std::thread::sleep(std::time::Duration::from_millis(1000)); - items.get().remove(0); } - }); + } rsx! { FlexRow { for item in items { static "{item}" - static "Idk {item}" } } } diff --git a/src/macros.rs b/src/macros.rs index 384a3ab..d47c0ad 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -189,6 +189,51 @@ macro_rules! transform { }}; } +/// Spawns a thread with referencing dependencies. +/// +/// This macro spawns a thread and clones states and either references them or uses them as a dependency. +/// +/// # Example +/// ```rust +/// let count = use_state(0); +/// run! { +/// ref count // ref means that it will only reference the count (clone) +/// use count // implement count as a dependency, running this again if it updates +/// { +/// // do something with the count +/// } +/// } +/// ``` +#[macro_export] +macro_rules! run { + ($(ref $r:ident)* $(use $d:ident)* $code:block) => { + std::thread::spawn({ + $(let $r = $r.clone();)* $( + let $d = $d.clone(); + $d.add(); + )* + move || { + $code + loop { + $( + if $d.check() { + $code + } + )* + std::thread::sleep(std::time::Duration::from_millis(50)); + } + } + }); + }; + + ($(ref $r:ident)* $code:block) => { + std::thread::spawn({ + $(let $r = $r.clone();)* $(let $d = $d.clone();)* + move || $code + }); + }; +} + /// Constructs an `Rsx` tree using declarative syntax. /// /// This macro is similar to JSX in UI frameworks, allowing you to nest widgets and assign components or dependencies.