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