Skip to main content

p3_maybe_rayon/
lib.rs

1#![no_std]
2
3#[cfg(not(feature = "parallel"))]
4mod serial;
5
6pub mod prelude {
7    #[cfg(not(feature = "parallel"))]
8    pub use core::iter::{
9        ExactSizeIterator as IndexedParallelIterator, Iterator as ParallelIterator,
10    };
11    use core::marker::{Send, Sync};
12
13    #[cfg(feature = "parallel")]
14    pub use rayon::prelude::*;
15    #[cfg(feature = "parallel")]
16    pub use rayon::{current_num_threads, join};
17
18    #[cfg(not(feature = "parallel"))]
19    pub use super::serial::*;
20
21    pub trait SharedExt: ParallelIterator {
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
30    impl<I: ParallelIterator> SharedExt for I {
31        #[inline]
32        fn par_fold_reduce<Acc, Id, F, R>(self, identity: Id, fold_op: F, reduce_op: R) -> Acc
33        where
34            Acc: Send,
35            Id: Fn() -> Acc + Sync + Send,
36            F: Fn(Acc, Self::Item) -> Acc + Sync + Send,
37            R: Fn(Acc, Acc) -> Acc + Sync + Send,
38        {
39            #[cfg(feature = "parallel")]
40            {
41                self.fold(&identity, fold_op).reduce(&identity, reduce_op)
42            }
43
44            #[cfg(not(feature = "parallel"))]
45            {
46                let _ = reduce_op;
47                self.fold(identity(), fold_op)
48            }
49        }
50    }
51}
52
53pub mod iter {
54    #[cfg(not(feature = "parallel"))]
55    pub use core::iter::{repeat, repeat_n};
56
57    #[cfg(feature = "parallel")]
58    pub use rayon::iter::{repeat, repeat_n};
59}