orx_parallel/infallible/par_enum.rs
1use crate::Par;
2use crate::infallible::{ParIter, XapEnumByInput};
3use orx_concurrent_iter::{ConcurrentIter, enumerate::Enumerate};
4
5/// Adds index-value pairs to infallible parallel iterators.
6///
7/// This is the parallel counterpart of [`Iterator::enumerate`](core::iter::Iterator::enumerate).
8///
9/// # Example
10///
11/// ```
12/// use orx_parallel::*;
13///
14/// let pairs: Vec<_> = (10..15)
15/// .into_par()
16/// .enumerate()
17/// .collect();
18///
19/// assert_eq!(pairs.len(), 5);
20/// assert!(pairs.contains(&(0, 10)));
21/// assert!(pairs.contains(&(4, 14)));
22/// ```
23pub trait EnumeratePar: Par {
24 /// Transforms each item into `(index, item)`.
25 ///
26 /// Indices are zero-based and correspond to the iterator order.
27 ///
28 /// # Example
29 ///
30 /// ```
31 /// use orx_parallel::*;
32 ///
33 /// let idx_sum: usize = (1..6)
34 /// .into_par()
35 /// .enumerate()
36 /// .map(|(i, _)| i)
37 /// .sum();
38 ///
39 /// assert_eq!(idx_sum, 10);
40 /// ```
41 fn enumerate(self) -> impl Par<Item = (usize, Self::Item), Input = Enumerate<Self::Input>>;
42}
43
44impl<P> EnumeratePar for P
45where
46 P: Par,
47 P::Xap: XapEnumByInput,
48{
49 fn enumerate(self) -> impl Par<Item = (usize, Self::Item), Input = Enumerate<Self::Input>>
50 where
51 Self::Xap: XapEnumByInput,
52 {
53 let (iter, xap, exe, params) = self.destruct();
54 let iter = iter.enumerate();
55 let xap = xap.enumerate();
56 ParIter::new(iter, xap, exe, params)
57 }
58}