p3_maybe_rayon/
lib.rs

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