maybe_rayon/
concurrent.rs1pub mod prelude {
2 pub use rayon::iter::{IndexedParallelIterator, ParallelIterator};
3 use rayon::prelude::*;
4
5 pub trait MaybeParallelIterator: ParallelIterator {}
6
7 pub trait MaybeIndexedParallelIterator: IndexedParallelIterator {}
8
9 pub trait IntoMaybeParallelIterator: IntoParallelIterator + Sized {
10 fn into_maybe_par_iter(self) -> Self::Iter {
11 self.into_par_iter()
12 }
13 }
14
15 pub trait IntoMaybeParallelRefMutIterator<'data>: IntoParallelRefMutIterator<'data> {
16 fn maybe_par_iter_mut(&'data mut self) -> Self::Iter {
17 self.par_iter_mut()
18 }
19 }
20
21 pub type MaybeIterBridge<I> = rayon::iter::IterBridge<I>;
22
23 pub trait MaybeParallelBridge: ParallelBridge {
24 fn maybe_par_bridge(self) -> MaybeIterBridge<Self> {
25 self.par_bridge()
26 }
27 }
28
29 pub trait MaybeParallelSliceMut<T: Send>: ParallelSliceMut<T> {
30 fn maybe_par_chunks_mut<'data>(
31 &'data mut self,
32 chunk_size: usize,
33 ) -> impl MaybeIndexedParallelIterator<Item = &'data mut [T]>
34 where
35 T: 'data,
36 {
37 self.par_chunks_mut(chunk_size)
38 }
39 }
40
41 impl<I: ParallelIterator> MaybeParallelIterator for I {}
44
45 impl<I: IndexedParallelIterator> MaybeIndexedParallelIterator for I {}
46
47 impl<I: IntoParallelIterator> IntoMaybeParallelIterator for I {}
48
49 impl<'data, I: 'data + ?Sized> IntoMaybeParallelRefMutIterator<'data> for I where
50 &'data mut I: IntoMaybeParallelIterator
51 {
52 }
53
54 impl<I: ParallelBridge> MaybeParallelBridge for I {}
55
56 impl<T: Send> MaybeParallelSliceMut<T> for [T] {}
57}
58
59pub fn join<A, B, RA, RB>(oper_a: A, oper_b: B) -> (RA, RB)
60where
61 A: FnOnce() -> RA + Send,
62 B: FnOnce() -> RB + Send,
63 RA: Send,
64 RB: Send,
65{
66 rayon::join(oper_a, oper_b)
67}
68
69pub type Scope<'scope> = rayon::Scope<'scope>;
70
71pub fn scope<'scope, OP, R>(op: OP) -> R
72where
73 OP: FnOnce(&Scope<'scope>) -> R + Send,
74 R: Send,
75{
76 rayon::scope(op)
77}
78
79pub fn in_place_scope<'scope, OP, R>(op: OP) -> R
80where
81 OP: FnOnce(&Scope<'scope>) -> R,
82{
83 rayon::in_place_scope(op)
84}
85
86pub fn empty<T: Send>() -> rayon::iter::Empty<T> {
87 rayon::iter::empty()
88}