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