Skip to main content

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}