orx_parallel/collect_into/
par_collect_into.rs

1use crate::Params;
2use crate::generic_values::runner_results::{Fallibility, Infallible};
3use crate::generic_values::{TransformableValues, Values};
4use crate::runner::ParallelRunner;
5use crate::using::UParCollectIntoCore;
6use orx_concurrent_iter::ConcurrentIter;
7use orx_iterable::Collection;
8use orx_pinned_vec::IntoConcurrentPinnedVec;
9
10pub trait ParCollectIntoCore<O>: Collection<Item = O> {
11    type BridgePinnedVec: IntoConcurrentPinnedVec<O>;
12
13    fn empty(iter_len: Option<usize>) -> Self;
14
15    fn m_collect_into<R, I, M1>(self, orchestrator: R, params: Params, iter: I, map1: M1) -> Self
16    where
17        R: ParallelRunner,
18        I: ConcurrentIter,
19        M1: Fn(I::Item) -> O + Sync;
20
21    fn x_collect_into<R, I, Vo, X1>(
22        self,
23        orchestrator: R,
24        params: Params,
25        iter: I,
26        xap1: X1,
27    ) -> Self
28    where
29        R: ParallelRunner,
30        I: ConcurrentIter,
31        Vo: TransformableValues<Item = O, Fallibility = Infallible>,
32        X1: Fn(I::Item) -> Vo + Sync;
33
34    fn x_try_collect_into<R, I, Vo, X1>(
35        self,
36        orchestrator: R,
37        params: Params,
38        iter: I,
39        xap1: X1,
40    ) -> Result<Self, <Vo::Fallibility as Fallibility>::Error>
41    where
42        R: ParallelRunner,
43        I: ConcurrentIter,
44        X1: Fn(I::Item) -> Vo + Sync,
45        Vo: Values<Item = O>,
46        Self: Sized;
47
48    // test
49
50    #[cfg(test)]
51    fn length(&self) -> usize;
52
53    #[cfg(test)]
54    fn is_empty(&self) -> bool {
55        self.length() == 0
56    }
57
58    #[cfg(test)]
59    fn is_equal_to<'a>(&self, b: impl orx_iterable::Iterable<Item = &'a O>) -> bool
60    where
61        O: PartialEq + 'a,
62    {
63        let mut b = b.iter();
64        for x in self.iter() {
65            match b.next() {
66                Some(y) if x != y => return false,
67                None => return false,
68                _ => {}
69            }
70        }
71
72        b.next().is_none()
73    }
74
75    #[cfg(test)]
76    fn is_equal_to_ref(&self, b: impl orx_iterable::Iterable<Item = O>) -> bool
77    where
78        O: PartialEq,
79    {
80        let mut b = b.iter();
81        for x in self.iter() {
82            match b.next() {
83                Some(y) if x != &y => return false,
84                None => return false,
85                _ => {}
86            }
87        }
88
89        b.next().is_none()
90    }
91}
92
93/// Collection types into which outputs of a parallel computations can be collected into.
94pub trait ParCollectInto<O>: ParCollectIntoCore<O> + UParCollectIntoCore<O> {}
95
96impl<O, C> ParCollectInto<O> for C where C: ParCollectIntoCore<O> + UParCollectIntoCore<O> {}