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 {}