#[cfg(not(target_arch = "wasm32"))]
pub use rayon::prelude::{
IndexedParallelIterator, IntoParallelIterator, ParallelIterator, ParallelSliceMut,
};
#[cfg(target_arch = "wasm32")]
pub use shim::{IntoParallelIterator, ParallelIterator, ParallelSliceMut};
#[cfg(target_arch = "wasm32")]
mod shim {
pub trait IntoParallelIterator {
type Item;
type Iter: Iterator<Item = Self::Item>;
fn into_par_iter(self) -> Self::Iter;
}
impl<T: IntoIterator> IntoParallelIterator for T {
type Item = T::Item;
type Iter = T::IntoIter;
fn into_par_iter(self) -> Self::Iter {
self.into_iter()
}
}
pub trait ParallelSliceMut<T> {
fn par_chunks_mut(&mut self, chunk_size: usize) -> core::slice::ChunksMut<'_, T>;
}
impl<T> ParallelSliceMut<T> for [T] {
fn par_chunks_mut(&mut self, chunk_size: usize) -> core::slice::ChunksMut<'_, T> {
self.chunks_mut(chunk_size)
}
}
pub trait ParallelIterator: Iterator + Sized {
fn for_each_with<S, F>(self, init: S, mut op: F)
where
F: FnMut(&mut S, Self::Item),
{
let mut init = init;
for item in self {
op(&mut init, item);
}
}
}
impl<I: Iterator> ParallelIterator for I {}
}