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}