arch_pkg_db/multi/iter/
entries.rs

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