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}