#[cfg(feature = "parallel")]
pub fn maybe_par_map<T, F>(n: usize, threshold: usize, f: F) -> Vec<T>
where
T: Send,
F: Fn(usize) -> T + Sync + Send,
{
use rayon::prelude::*;
if n >= threshold {
(0..n).into_par_iter().map(f).collect()
} else {
(0..n).map(f).collect()
}
}
#[cfg(not(feature = "parallel"))]
pub fn maybe_par_map<T, F>(n: usize, _threshold: usize, f: F) -> Vec<T>
where
F: Fn(usize) -> T,
{
(0..n).map(f).collect()
}
#[cfg(feature = "parallel")]
pub fn maybe_par_map_ct<T, F>(
n: usize,
threshold: usize,
token: Option<&crate::cancel::CancelToken>,
f: F,
) -> Option<Vec<T>>
where
T: Send,
F: Fn(usize) -> T + Sync + Send,
{
use rayon::prelude::*;
let Some(token) = token else {
return Some(maybe_par_map(n, threshold, f));
};
if n >= threshold {
(0..n)
.into_par_iter()
.map(|i| if token.is_cancelled() { None } else { Some(f(i)) })
.collect()
} else {
(0..n)
.map(|i| if token.is_cancelled() { None } else { Some(f(i)) })
.collect()
}
}
#[cfg(not(feature = "parallel"))]
pub fn maybe_par_map_ct<T, F>(
n: usize,
threshold: usize,
token: Option<&crate::cancel::CancelToken>,
f: F,
) -> Option<Vec<T>>
where
F: Fn(usize) -> T,
{
let Some(token) = token else {
return Some(maybe_par_map(n, threshold, f));
};
(0..n)
.map(|i| if token.is_cancelled() { None } else { Some(f(i)) })
.collect()
}