1#[cfg(not(target_arch = "wasm32"))]
2pub use rayon::prelude::*;
3
4#[cfg(target_arch = "wasm32")]
5pub use wasm_compat::*;
6
7#[cfg(target_arch = "wasm32")]
8pub mod wasm_compat {
9 pub trait IntoParallelIterator {
10 type Item;
11 type Iter: Iterator<Item = Self::Item>;
12 fn into_par_iter(self) -> Self::Iter;
13 }
14
15 impl<I: IntoIterator> IntoParallelIterator for I {
16 type Item = I::Item;
17 type Iter = I::IntoIter;
18 fn into_par_iter(self) -> Self::Iter {
19 self.into_iter()
20 }
21 }
22
23 pub trait IntoParallelRefIterator<'data> {
24 type Item: 'data;
25 type Iter: Iterator<Item = Self::Item>;
26 fn par_iter(&'data self) -> Self::Iter;
27 }
28
29 impl<'data, I: 'data + ?Sized> IntoParallelRefIterator<'data> for I
30 where
31 &'data I: IntoIterator,
32 {
33 type Item = <&'data I as IntoIterator>::Item;
34 type Iter = <&'data I as IntoIterator>::IntoIter;
35 fn par_iter(&'data self) -> Self::Iter {
36 self.into_iter()
37 }
38 }
39
40 pub trait IntoParallelRefMutIterator<'data> {
41 type Item: 'data;
42 type Iter: Iterator<Item = Self::Item>;
43 fn par_iter_mut(&'data mut self) -> Self::Iter;
44 }
45
46 impl<'data, I: 'data + ?Sized> IntoParallelRefMutIterator<'data> for I
47 where
48 &'data mut I: IntoIterator,
49 {
50 type Item = <&'data mut I as IntoIterator>::Item;
51 type Iter = <&'data mut I as IntoIterator>::IntoIter;
52 fn par_iter_mut(&'data mut self) -> Self::Iter {
53 self.into_iter()
54 }
55 }
56
57 pub trait ParallelSlice<T> {
59 fn par_chunks<'a>(&'a self, chunk_size: usize) -> std::slice::Chunks<'a, T>;
60 }
61
62 impl<T> ParallelSlice<T> for [T] {
63 fn par_chunks<'a>(&'a self, chunk_size: usize) -> std::slice::Chunks<'a, T> {
64 self.chunks(chunk_size)
65 }
66 }
67
68 pub trait ParallelSliceMut<T> {
69 fn par_chunks_mut<'a>(&'a mut self, chunk_size: usize) -> std::slice::ChunksMut<'a, T>;
70 }
71
72 impl<T> ParallelSliceMut<T> for [T] {
73 fn par_chunks_mut<'a>(&'a mut self, chunk_size: usize) -> std::slice::ChunksMut<'a, T> {
74 self.chunks_mut(chunk_size)
75 }
76 }
77}