1#![no_std]
2
3#[cfg(not(feature = "parallel"))]
4mod serial;
5
6pub mod prelude {
7 #[cfg(not(feature = "parallel"))]
8 pub use core::iter::{
9 ExactSizeIterator as IndexedParallelIterator, Iterator as ParallelIterator,
10 };
11 use core::marker::{Send, Sync};
12
13 #[cfg(feature = "parallel")]
14 pub use rayon::prelude::*;
15 #[cfg(feature = "parallel")]
16 pub use rayon::{current_num_threads, join};
17
18 #[cfg(not(feature = "parallel"))]
19 pub use super::serial::*;
20
21 pub trait SharedExt: ParallelIterator {
22 fn par_fold_reduce<Acc, Id, F, R>(self, identity: Id, fold_op: F, reduce_op: R) -> Acc
23 where
24 Acc: Send,
25 Id: Fn() -> Acc + Sync + Send,
26 F: Fn(Acc, Self::Item) -> Acc + Sync + Send,
27 R: Fn(Acc, Acc) -> Acc + Sync + Send;
28 }
29
30 impl<I: ParallelIterator> SharedExt for I {
31 #[inline]
32 fn par_fold_reduce<Acc, Id, F, R>(self, identity: Id, fold_op: F, reduce_op: R) -> Acc
33 where
34 Acc: Send,
35 Id: Fn() -> Acc + Sync + Send,
36 F: Fn(Acc, Self::Item) -> Acc + Sync + Send,
37 R: Fn(Acc, Acc) -> Acc + Sync + Send,
38 {
39 #[cfg(feature = "parallel")]
40 {
41 self.fold(&identity, fold_op).reduce(&identity, reduce_op)
42 }
43
44 #[cfg(not(feature = "parallel"))]
45 {
46 let _ = reduce_op;
47 self.fold(identity(), fold_op)
48 }
49 }
50 }
51}
52
53pub mod iter {
54 #[cfg(not(feature = "parallel"))]
55 pub use core::iter::{repeat, repeat_n};
56
57 #[cfg(feature = "parallel")]
58 pub use rayon::iter::{repeat, repeat_n};
59}