evobench_tools/utillib/rayon_util/
par_run.rs

1//! Utilities for working with the
2//! [rayon](https://crates.io/crates/rayon) crate
3
4pub trait ParRun {
5    type Output;
6    fn par_run(self) -> Self::Output;
7}
8
9impl<F1, F2, T1, T2> ParRun for (F1, F2)
10where
11    F1: FnOnce() -> T1 + Send,
12    F2: FnOnce() -> T2 + Send,
13    T1: Send,
14    T2: Send,
15{
16    type Output = (T1, T2);
17
18    fn par_run(self) -> Self::Output {
19        let (f1, f2) = self;
20        rayon::join(f1, f2)
21    }
22}
23
24impl<F1, F2, F3, T1, T2, T3> ParRun for (F1, F2, F3)
25where
26    F1: FnOnce() -> T1 + Send,
27    F2: FnOnce() -> T2 + Send,
28    F3: FnOnce() -> T3 + Send,
29    T1: Send,
30    T2: Send,
31    T3: Send,
32{
33    type Output = (T1, T2, T3);
34
35    fn par_run(self) -> Self::Output {
36        let (f1, f2, f3) = self;
37        let (v1, (v2, v3)) = rayon::join(f1, || rayon::join(f2, f3));
38        (v1, v2, v3)
39    }
40}
41
42impl<F1, F2, F3, F4, T1, T2, T3, T4> ParRun for (F1, F2, F3, F4)
43where
44    F1: FnOnce() -> T1 + Send,
45    F2: FnOnce() -> T2 + Send,
46    F3: FnOnce() -> T3 + Send,
47    F4: FnOnce() -> T4 + Send,
48    T1: Send,
49    T2: Send,
50    T3: Send,
51    T4: Send,
52{
53    type Output = (T1, T2, T3, T4);
54
55    fn par_run(self) -> Self::Output {
56        let (f1, f2, f3, f4) = self;
57        let ((v1, v2), (v3, v4)) = rayon::join(|| rayon::join(f1, f2), || rayon::join(f3, f4));
58        (v1, v2, v3, v4)
59    }
60}
61
62impl<F1, F2, F3, F4, F5, T1, T2, T3, T4, T5> ParRun for (F1, F2, F3, F4, F5)
63where
64    F1: FnOnce() -> T1 + Send,
65    F2: FnOnce() -> T2 + Send,
66    F3: FnOnce() -> T3 + Send,
67    F4: FnOnce() -> T4 + Send,
68    F5: FnOnce() -> T5 + Send,
69    T1: Send,
70    T2: Send,
71    T3: Send,
72    T4: Send,
73    T5: Send,
74{
75    type Output = (T1, T2, T3, T4, T5);
76
77    fn par_run(self) -> Self::Output {
78        let (f1, f2, f3, f4, f5) = self;
79        let ((v1, v2), (v3, (v4, v5))) = rayon::join(
80            || rayon::join(f1, f2),
81            || rayon::join(f3, || rayon::join(f4, f5)),
82        );
83        (v1, v2, v3, v4, v5)
84    }
85}