p3_maybe_rayon/
lib.rs

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