orx_parallel/
parallelizable.rs

1use crate::{computational_variants::Par, parameters::Params, runner::DefaultRunner};
2use orx_concurrent_iter::ConcurrentIterable;
3
4/// `Parallelizable` types are those from which parallel iterators can be created
5/// **multiple times** using the [`par`] method, since this method call does not consume the source.
6///
7/// This trait can be considered as the *parallel counterpart* of the [`Iterable`] trait.
8///
9/// Note that every [`ConcurrentIterable`] type automatically implements [`Parallelizable`].
10///
11/// [`par`]: crate::Parallelizable::par
12/// [`Iterable`]: orx_iterable::Iterable
13/// [`ConcurrentIterable`]: orx_concurrent_iter::ConcurrentIterable
14///
15/// # Examples
16///
17/// ```
18/// use orx_parallel::*;
19///
20/// // Vec<T>: Parallelizable<Item = &T>
21/// let vec = vec![1, 2, 3, 4];
22/// assert_eq!(vec.par().sum(), 10);
23/// assert_eq!(vec.par().max(), Some(&4));
24///
25/// // &[T]: Parallelizable<Item = &T>
26/// let slice = vec.as_slice();
27/// assert_eq!(slice.par().sum(), 10);
28/// assert_eq!(slice.par().max(), Some(&4));
29///
30/// // Range<T>: Parallelizable<Item = T>
31/// let range = 1..5;
32/// assert_eq!(range.par().sum(), 10);
33/// assert_eq!(range.par().max(), Some(4));
34/// ```
35pub trait Parallelizable: ConcurrentIterable {
36    /// `Parallelizable` types are those from which parallel iterators can be created
37    /// **multiple times** using the [`par`] method, since this method call does not consume the source.
38    ///
39    /// This trait can be considered as the *parallel counterpart* of the [`Iterable`] trait.
40    ///
41    /// [`par`]: crate::Parallelizable::par
42    /// [`Iterable`]: orx_iterable::Iterable
43    ///
44    /// # Examples
45    ///
46    /// ```
47    /// use orx_parallel::*;
48    ///
49    /// // Vec<T>: Parallelizable<Item = &T>
50    /// let vec = vec![1, 2, 3, 4];
51    /// assert_eq!(vec.par().sum(), 10);
52    /// assert_eq!(vec.par().max(), Some(&4));
53    ///
54    /// // &[T]: Parallelizable<Item = &T>
55    /// let slice = vec.as_slice();
56    /// assert_eq!(slice.par().sum(), 10);
57    /// assert_eq!(slice.par().max(), Some(&4));
58    ///
59    /// // Range<T>: Parallelizable<Item = T>
60    /// let range = 1..5;
61    /// assert_eq!(range.par().sum(), 10);
62    /// assert_eq!(range.par().max(), Some(4));
63    /// ```
64    fn par(&self) -> Par<<Self as ConcurrentIterable>::Iter, DefaultRunner> {
65        Par::new(Params::default(), self.con_iter())
66    }
67}
68
69impl<I> Parallelizable for I where I: ConcurrentIterable {}