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