p3_maybe_rayon/
lib.rs

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}