orx_concurrent_iter/
concurrent_iterable.rs

1use crate::{concurrent_iter::ConcurrentIter, into_concurrent_iter::IntoConcurrentIter};
2
3/// [`ConcurrentIterable`] types are those from which concurrent iterators can be created
4/// **multiple times** using the [`con_iter`] method, since this method call does not consume the source.
5///
6/// This trait can be considered as the *concurrent counterpart* of the [`Iterable`] trait.
7///
8/// [`con_iter`]: crate::ConcurrentIterable::con_iter
9/// [`Iterable`]: orx_iterable::Iterable
10///
11/// # Examples
12///
13/// ```
14/// use orx_concurrent_iter::*;
15///
16/// let vec = vec![1, 2]; // Vec<T>: ConcurrentIterable<Item = &T>
17/// for _ in 0..5 {
18///     let con_iter = vec.con_iter();
19///     assert_eq!(con_iter.next(), Some(&1));
20///     assert_eq!(con_iter.next(), Some(&2));
21///     assert_eq!(con_iter.next(), None);
22/// }
23///
24/// let slice = vec.as_slice(); // &[T]: ConcurrentIterable<Item = &T>
25/// for _ in 0..5 {
26///     let con_iter = slice.con_iter();
27///     assert_eq!(con_iter.next(), Some(&1));
28///     assert_eq!(con_iter.next(), Some(&2));
29///     assert_eq!(con_iter.next(), None);
30/// }
31///
32/// let range = 11..13; // Range<T>: ConcurrentIterable<Item = T>
33/// for _ in 0..5 {
34///     let con_iter = range.con_iter();
35///     assert_eq!(con_iter.next(), Some(11));
36///     assert_eq!(con_iter.next(), Some(12));
37///     assert_eq!(con_iter.next(), None);
38/// }
39/// ```
40pub trait ConcurrentIterable {
41    /// Type of the element that the concurrent iterator yields.
42    type Item;
43
44    /// Type of the concurrent iterator that this type can create with `con_iter` method.
45    type Iter: ConcurrentIter<Item = Self::Item>;
46
47    /// [`ConcurrentIterable`] types are those from which concurrent iterators can be created
48    /// **multiple times** using the [`con_iter`] method, since this method call does not consume the source.
49    ///
50    /// This trait can be considered as the *concurrent counterpart* of the [`Iterable`] trait.
51    ///
52    /// [`con_iter`]: crate::ConcurrentIterable::con_iter
53    /// [`Iterable`]: orx_iterable::Iterable
54    ///
55    /// # Examples
56    ///
57    /// ```
58    /// use orx_concurrent_iter::*;
59    ///
60    /// let vec = vec![1, 2]; // Vec<T>: ConcurrentIterable<Item = &T>
61    /// for _ in 0..5 {
62    ///     let con_iter = vec.con_iter();
63    ///     assert_eq!(con_iter.next(), Some(&1));
64    ///     assert_eq!(con_iter.next(), Some(&2));
65    ///     assert_eq!(con_iter.next(), None);
66    /// }
67    ///
68    /// let slice = vec.as_slice(); // &[T]: ConcurrentIterable<Item = &T>
69    /// for _ in 0..5 {
70    ///     let con_iter = slice.con_iter();
71    ///     assert_eq!(con_iter.next(), Some(&1));
72    ///     assert_eq!(con_iter.next(), Some(&2));
73    ///     assert_eq!(con_iter.next(), None);
74    /// }
75    ///
76    /// let range = 11..13; // Range<T>: ConcurrentIterable<Item = T>
77    /// for _ in 0..5 {
78    ///     let con_iter = range.con_iter();
79    ///     assert_eq!(con_iter.next(), Some(11));
80    ///     assert_eq!(con_iter.next(), Some(12));
81    ///     assert_eq!(con_iter.next(), None);
82    /// }
83    /// ```
84    fn con_iter(&self) -> Self::Iter;
85}
86
87// impl
88
89impl<'a, X> ConcurrentIterable for &'a X
90where
91    &'a X: IntoConcurrentIter,
92{
93    type Item = <&'a X as IntoConcurrentIter>::Item;
94
95    type Iter = <&'a X as IntoConcurrentIter>::IntoIter;
96
97    fn con_iter(&self) -> Self::Iter {
98        self.into_con_iter()
99    }
100}