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}