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}