Skip to main content

p3_maybe_rayon/
lib.rs

1//! Thin compatibility layer that re-exports either `rayon` or a sequential
2//! fallback under a unified prelude, gated by the `parallel` feature.
3
4#![no_std]
5
6#[cfg(not(feature = "parallel"))]
7mod serial;
8
9pub mod prelude {
10    #[cfg(not(feature = "parallel"))]
11    pub use core::iter::{
12        ExactSizeIterator as IndexedParallelIterator, Iterator as ParallelIterator,
13    };
14    use core::marker::{Send, Sync};
15
16    #[cfg(feature = "parallel")]
17    pub use rayon::prelude::*;
18    #[cfg(feature = "parallel")]
19    pub use rayon::{current_num_threads, join};
20
21    #[cfg(not(feature = "parallel"))]
22    pub use super::serial::*;
23
24    pub trait SharedExt: ParallelIterator {
25        fn par_fold_reduce<Acc, Id, F, R>(self, identity: Id, fold_op: F, reduce_op: R) -> Acc
26        where
27            Acc: Send,
28            Id: Fn() -> Acc + Sync + Send,
29            F: Fn(Acc, Self::Item) -> Acc + Sync + Send,
30            R: Fn(Acc, Acc) -> Acc + Sync + Send;
31    }
32
33    impl<I: ParallelIterator> SharedExt for I {
34        #[inline]
35        fn par_fold_reduce<Acc, Id, F, R>(self, identity: Id, fold_op: F, reduce_op: R) -> Acc
36        where
37            Acc: Send,
38            Id: Fn() -> Acc + Sync + Send,
39            F: Fn(Acc, Self::Item) -> Acc + Sync + Send,
40            R: Fn(Acc, Acc) -> Acc + Sync + Send,
41        {
42            #[cfg(feature = "parallel")]
43            {
44                self.fold(&identity, fold_op).reduce(&identity, reduce_op)
45            }
46
47            #[cfg(not(feature = "parallel"))]
48            {
49                let _ = reduce_op;
50                self.fold(identity(), fold_op)
51            }
52        }
53    }
54}
55
56pub mod iter {
57    #[cfg(not(feature = "parallel"))]
58    pub use core::iter::{repeat, repeat_n};
59
60    #[cfg(feature = "parallel")]
61    pub use rayon::iter::{repeat, repeat_n};
62}