#[cfg(feature = "parallel")]
pub trait MaybeSync: Sync {}
#[cfg(feature = "parallel")]
impl<T: Sync + ?Sized> MaybeSync for T {}
#[cfg(feature = "parallel")]
pub trait MaybeSend: Send {}
#[cfg(feature = "parallel")]
impl<T: Send + ?Sized> MaybeSend for T {}
#[cfg(not(feature = "parallel"))]
pub trait MaybeSync {}
#[cfg(not(feature = "parallel"))]
impl<T: ?Sized> MaybeSync for T {}
#[cfg(not(feature = "parallel"))]
pub trait MaybeSend {}
#[cfg(not(feature = "parallel"))]
impl<T: ?Sized> MaybeSend for T {}
#[cfg(feature = "parallel")]
pub(crate) fn try_map_range_with<S, T, E, FInit, F>(
n: usize,
init: FInit,
f: F,
) -> Result<Vec<T>, E>
where
T: Send,
E: Send,
FInit: Fn() -> S + Sync + Send,
F: Fn(&mut S, usize) -> Result<T, E> + Sync + Send,
{
use rayon::prelude::*;
(0..n).into_par_iter().map_init(init, f).collect()
}
#[cfg(not(feature = "parallel"))]
pub(crate) fn try_map_range_with<S, T, E, FInit, F>(
n: usize,
init: FInit,
f: F,
) -> Result<Vec<T>, E>
where
FInit: FnOnce() -> S,
F: Fn(&mut S, usize) -> Result<T, E>,
{
let mut scratch = init();
(0..n).map(|j| f(&mut scratch, j)).collect()
}
#[cfg(feature = "parallel")]
pub(crate) fn try_map_slice_with<I, S, T, E, FInit, F>(
items: &[I],
init: FInit,
f: F,
) -> Result<Vec<T>, E>
where
I: Sync,
T: Send,
E: Send,
FInit: Fn() -> S + Sync + Send,
F: Fn(&mut S, &I) -> Result<T, E> + Sync + Send,
{
use rayon::prelude::*;
items.par_iter().map_init(init, f).collect()
}
#[cfg(not(feature = "parallel"))]
pub(crate) fn try_map_slice_with<I, S, T, E, FInit, F>(
items: &[I],
init: FInit,
f: F,
) -> Result<Vec<T>, E>
where
FInit: FnOnce() -> S,
F: Fn(&mut S, &I) -> Result<T, E>,
{
let mut scratch = init();
items.iter().map(|it| f(&mut scratch, it)).collect()
}