arch_pkg_db/multi/iter/
queriers.rs

1use crate::multi::{
2    LatestQuerier, MultiQuerier, MultiQueryDatabase, MultiQueryDatabaseLatest, WithVersion,
3};
4use core::{
5    iter::FusedIterator,
6    ops::{Deref, DerefMut},
7};
8use pipe_trait::Pipe;
9use std::collections::hash_map::{Values, ValuesMut};
10
11/// [Iterator] over all immutable queriers in a [`MultiQueryDatabase`].
12#[derive(Debug, Clone)]
13pub struct MultiQueriers<'r, 'query, Querier> {
14    internal: Values<'r, &'query str, MultiQuerier<'query, Querier>>,
15}
16
17impl<'r, 'query, Querier> Iterator for MultiQueriers<'r, 'query, Querier> {
18    type Item = &'r MultiQuerier<'query, Querier>;
19
20    fn next(&mut self) -> Option<Self::Item> {
21        self.internal.next()
22    }
23
24    fn size_hint(&self) -> (usize, Option<usize>) {
25        self.internal.size_hint()
26    }
27
28    fn count(self) -> usize {
29        self.internal.count()
30    }
31}
32
33impl<Querier> ExactSizeIterator for MultiQueriers<'_, '_, Querier> {
34    fn len(&self) -> usize {
35        self.internal.len()
36    }
37}
38
39impl<Querier> FusedIterator for MultiQueriers<'_, '_, Querier> {}
40
41/// [Iterator] over all mutable queriers in a [`MultiQueryDatabase`].
42#[derive(Debug)]
43pub struct MultiQueriersMut<'r, 'query, Querier> {
44    internal: ValuesMut<'r, &'query str, MultiQuerier<'query, Querier>>,
45}
46
47impl<'r, 'query, Querier> Iterator for MultiQueriersMut<'r, 'query, Querier> {
48    type Item = &'r mut MultiQuerier<'query, Querier>;
49
50    fn next(&mut self) -> Option<Self::Item> {
51        self.internal.next()
52    }
53
54    fn size_hint(&self) -> (usize, Option<usize>) {
55        self.internal.size_hint()
56    }
57
58    fn count(self) -> usize {
59        self.internal.count()
60    }
61}
62
63impl<Querier> ExactSizeIterator for MultiQueriersMut<'_, '_, Querier> {
64    fn len(&self) -> usize {
65        self.internal.len()
66    }
67}
68
69impl<Querier> FusedIterator for MultiQueriersMut<'_, '_, Querier> {}
70
71impl<'a, Querier> MultiQueryDatabase<'a, Querier> {
72    /// Get an iterator over all immutable queriers.
73    pub fn queriers(&self) -> MultiQueriers<'_, 'a, Querier> {
74        MultiQueriers {
75            internal: self.internal.values(),
76        }
77    }
78
79    /// Get an iterator over all mutable queriers.
80    pub fn queriers_mut(&mut self) -> MultiQueriersMut<'_, 'a, Querier> {
81        MultiQueriersMut {
82            internal: self.internal.values_mut(),
83        }
84    }
85
86    /// Get an iterator over all immutable queriers of the latest versions of each package.
87    pub fn latest_queriers(&self) -> LatestQueriers<'_, 'a, Querier> {
88        LatestQueriers {
89            internal: self.internal.values(),
90        }
91    }
92
93    /// Get an iterator over all mutable queriers of the latest versions of each package.
94    pub fn latest_queriers_mut(&mut self) -> LatestQueriersMut<'_, 'a, Querier> {
95        LatestQueriersMut {
96            internal: self.internal.values_mut(),
97        }
98    }
99}
100
101/// [Iterator] over all immutable queriers in a [`MultiQuerier`].
102#[derive(Debug, Clone)]
103pub struct Queriers<'r, 'query, Querier> {
104    internal: Values<'r, &'query str, WithVersion<'query, Querier>>,
105}
106
107impl<'r, 'query, Querier> Iterator for Queriers<'r, 'query, Querier> {
108    type Item = &'r WithVersion<'query, Querier>;
109
110    fn next(&mut self) -> Option<Self::Item> {
111        self.internal.next()
112    }
113
114    fn size_hint(&self) -> (usize, Option<usize>) {
115        self.internal.size_hint()
116    }
117
118    fn count(self) -> usize {
119        self.internal.count()
120    }
121}
122
123impl<Querier> ExactSizeIterator for Queriers<'_, '_, Querier> {
124    fn len(&self) -> usize {
125        self.internal.len()
126    }
127}
128
129impl<Querier> FusedIterator for Queriers<'_, '_, Querier> {}
130
131/// [Iterator] over all mutable queriers in a [`MultiQuerier`].
132#[derive(Debug)]
133pub struct QueriersMut<'r, 'query, Querier> {
134    internal: ValuesMut<'r, &'query str, WithVersion<'query, Querier>>,
135}
136
137impl<'r, 'query, Querier> Iterator for QueriersMut<'r, 'query, Querier> {
138    type Item = &'r mut WithVersion<'query, Querier>;
139
140    fn next(&mut self) -> Option<Self::Item> {
141        self.internal.next()
142    }
143
144    fn size_hint(&self) -> (usize, Option<usize>) {
145        self.internal.size_hint()
146    }
147
148    fn count(self) -> usize {
149        self.internal.count()
150    }
151}
152
153impl<Querier> ExactSizeIterator for QueriersMut<'_, '_, Querier> {
154    fn len(&self) -> usize {
155        self.internal.len()
156    }
157}
158
159impl<Querier> FusedIterator for QueriersMut<'_, '_, Querier> {}
160
161impl<'a, Querier> MultiQuerier<'a, Querier> {
162    /// Get an iterator over all immutable queriers.
163    pub fn queriers(&self) -> Queriers<'_, 'a, Querier> {
164        Queriers {
165            internal: self.internal.values(),
166        }
167    }
168
169    /// Get an iterator over all mutable queriers.
170    pub fn queriers_mut(&mut self) -> QueriersMut<'_, 'a, Querier> {
171        QueriersMut {
172            internal: self.internal.values_mut(),
173        }
174    }
175}
176
177/// [Iterator] over all immutable queriers in a [`MultiQueryDatabaseLatest`].
178#[derive(Debug, Clone)]
179pub struct LatestQueriers<'r, 'query, Querier> {
180    internal: Values<'r, &'query str, MultiQuerier<'query, Querier>>,
181}
182
183impl<'r, 'query, Querier> Iterator for LatestQueriers<'r, 'query, Querier> {
184    type Item = LatestQuerier<'query, &'r Querier>;
185
186    fn next(&mut self) -> Option<Self::Item> {
187        self.internal.next()?.latest()
188    }
189
190    fn size_hint(&self) -> (usize, Option<usize>) {
191        (0, self.internal.len().pipe(Some))
192    }
193
194    fn count(self) -> usize {
195        self.internal.count()
196    }
197}
198
199impl<'query, Querier> FusedIterator for LatestQueriers<'_, 'query, Querier> {}
200
201/// [Iterator] over all mutable queriers in a [`MultiQueryDatabaseLatest`].
202#[derive(Debug)]
203pub struct LatestQueriersMut<'r, 'query, Querier> {
204    internal: ValuesMut<'r, &'query str, MultiQuerier<'query, Querier>>,
205}
206
207impl<'r, 'query, Querier> Iterator for LatestQueriersMut<'r, 'query, Querier> {
208    type Item = LatestQuerier<'query, &'r mut Querier>;
209
210    fn next(&mut self) -> Option<Self::Item> {
211        self.internal.next()?.latest_mut()
212    }
213
214    fn size_hint(&self) -> (usize, Option<usize>) {
215        (0, self.internal.len().pipe(Some))
216    }
217
218    fn count(self) -> usize {
219        self.internal.count()
220    }
221}
222
223impl<'query, Querier> FusedIterator for LatestQueriersMut<'_, 'query, Querier> {}
224
225impl<Ref> MultiQueryDatabaseLatest<Ref> {
226    /// Get an iterator over all immutable queriers.
227    pub fn queriers<'query, Querier>(&self) -> LatestQueriers<'_, 'query, Querier>
228    where
229        Ref: Deref<Target = MultiQueryDatabase<'query, Querier>>,
230    {
231        self.base.latest_queriers()
232    }
233
234    /// Get an iterator over all mutable queriers.
235    pub fn queriers_mut<'query, Querier>(&mut self) -> LatestQueriersMut<'_, 'query, Querier>
236    where
237        Ref: DerefMut<Target = MultiQueryDatabase<'query, Querier>>,
238    {
239        self.base.latest_queriers_mut()
240    }
241}