use rayon::prelude::{IntoParallelIterator, ParallelIterator};
#[inline]
pub(super) fn map_collect<R, F>(n: usize, parallel: bool, f: F) -> Vec<R>
where
R: Send,
F: Fn(usize) -> R + Sync + Send,
{
if parallel {
(0..n).into_par_iter().map(f).collect()
} else {
(0..n).map(f).collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn map_collect_seq_and_par_match_index_order() {
let seq: Vec<usize> = map_collect(3, false, |i| i * i);
assert_eq!(
seq,
vec![0, 1, 4],
"sequential branch must be index-ordered"
);
let par: Vec<usize> = map_collect(8, true, |i| i * i);
assert_eq!(
par,
vec![0, 1, 4, 9, 16, 25, 36, 49],
"parallel branch must preserve index order"
);
assert_eq!(
&par[..3],
&seq[..],
"seq and par must agree on shared indices"
);
}
#[test]
fn map_collect_empty() {
let out: Vec<usize> = map_collect(0, false, |i| i * 2);
assert!(out.is_empty(), "empty range must produce empty output");
}
}