Skip to main content

orx_parallel/into_parallel/
iter_into_par_iter.rs

1use crate::infallible::{ParIter, xap_variants::Id};
2use crate::runner::default_runner;
3use orx_concurrent_iter::{IterIntoConcurrentIter, implementations::ConIterOfIter};
4
5/// Converts a regular standard iterator into a parallel iterator.
6pub trait IterIntoParIter: Iterator {
7    /// Converts `self` into a parallel iterator.
8    ///
9    /// # Example
10    ///
11    /// ```
12    /// use orx_parallel::*;
13    ///
14    /// let sum: i32 = (0..10)
15    ///     .into_iter()
16    ///     .iter_into_par()
17    ///     .map(|x| x * 2)
18    ///     .sum();
19    ///
20    /// assert_eq!(sum, 90);
21    /// ```
22    fn iter_into_par(self) -> ParIter<ConIterOfIter<Self>, Id<Self::Item>>
23    where
24        Self: Sized,
25        Self::Item: Send;
26}
27
28impl<I> IterIntoParIter for I
29where
30    I: Iterator,
31    I::Item: Send + Sync,
32{
33    fn iter_into_par(self) -> ParIter<ConIterOfIter<Self>, Id<Self::Item>> {
34        ParIter::new(
35            self.iter_into_con_iter(),
36            Id::new(),
37            default_runner(),
38            Default::default(),
39        )
40    }
41}