#[macro_export]
macro_rules! par_izip {
( @closure $p:pat => $tup:expr ) => {
|$p| $tup
};
( @closure $p:pat => ( $($tup:tt)* ) , $_iter:expr $( , $tail:expr )* ) => {
par_izip!(@closure ($p, b) => ( $($tup)*, b ) $( , $tail )*)
};
($first:expr $(,)*) => {
rayon::prelude::IntoParallelRefIterator::par_iter(&$first)
};
($first:expr, $second:expr $(,)*) => {
par_izip!($first)
.zip($second)
};
( $first:expr $( , $rest:expr )* $(,)* ) => {
par_izip!($first)
$(
.zip($rest)
)*
.map(
par_izip!(@closure a => (a) $( , $rest )*)
)
};
}
#[cfg(test)]
mod tests {
use rayon::prelude::*;
#[test]
fn try_it() {
let v = par_izip!(vec![1, 2, 3], vec![1, 2, 3], vec![1, 2, 3])
.map(|(a, b, c)| {
println!("{a}, {b}, {c}");
a + b + c
})
.collect::<Vec<_>>();
println!("{v:?}");
}
}