From 06aa5a5c777379862393c1ca2b2d86b1e1d82c11 Mon Sep 17 00:00:00 2001 From: Daniel Kales <11509575+dkales@users.noreply.github.com> Date: Fri, 26 Sep 2025 14:37:23 +0200 Subject: [PATCH 1/2] feat: implement a cfg macro for joining two closures --- src/lib.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 4d59f70..7d3dd57 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -191,6 +191,29 @@ macro_rules! cfg_chunks_mut { }}; } +/// Executes two closures. If `parallel` feature is enabled, the closures +/// are executed in parallel using `rayon::join`. Otherwise, they are +/// executed sequentially. The result is returned as a tuple. +/// +/// ```rust +/// # use ark_std::cfg_join; +/// let (two, five) = cfg_join!(|| { 1 + 1 }, || { 2 + 3 }); +/// # assert_eq!(two, 2); +/// # assert_eq!(five, 5); +/// ``` +#[macro_export] +macro_rules! cfg_join { + ($e1: expr, $e2: expr) => {{ + #[cfg(feature = "parallel")] + let result = rayon::join($e1, $e2); + + #[cfg(not(feature = "parallel"))] + let result = ($e1(), $e2()); + + result + }}; +} + #[cfg(test)] mod test { use super::*; @@ -220,5 +243,15 @@ mod test { cfg_iter_mut!(&mut thing, 3).for_each(|i| *i += 1); println!("Iterating By Value"); cfg_into_iter!(thing, 3).for_each(|i| println!("{:?}", i)); + + println!("Joining"); + cfg_join!( + || { + println!("In first"); + }, + || { + println!("In second"); + } + ); } } From 26eee4586d8446f7ce82eaebd045d3b01523b395 Mon Sep 17 00:00:00 2001 From: Daniel Kales <11509575+dkales@users.noreply.github.com> Date: Fri, 26 Sep 2025 14:44:51 +0200 Subject: [PATCH 2/2] chore: add a bit more documentation + changelog --- CHANGELOG.md | 1 + src/lib.rs | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9368454..18eb0ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Features ### Improvements +- [\#65](https://github.com/arkworks-rs/std/pull/65) Add the `cfg_join` macro for executing two closures (potentially in parallel). ### Bug fixes diff --git a/src/lib.rs b/src/lib.rs index 7d3dd57..e55bf0e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -201,6 +201,17 @@ macro_rules! cfg_chunks_mut { /// # assert_eq!(two, 2); /// # assert_eq!(five, 5); /// ``` +/// +/// The macro can also be nested to join more than two closures: +/// ``` +/// # use ark_std::cfg_join; +/// +/// let (two, (five, seven)) = +/// cfg_join!(|| { 1 + 1 }, || cfg_join!(|| { 2 + 3 }, || { 1 + 6 })); +/// # assert_eq!(two, 2); +/// # assert_eq!(five, 5); +/// # assert_eq!(seven, 7); +/// ``` #[macro_export] macro_rules! cfg_join { ($e1: expr, $e2: expr) => {{