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#[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#[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 pub fn entries(&self) -> MultiEntries<'_, 'a, Querier> {
80 MultiEntries {
81 internal: self.internal.iter(),
82 }
83 }
84
85 pub fn entries_mut(&mut self) -> MultiEntriesMut<'_, 'a, Querier> {
87 MultiEntriesMut {
88 internal: self.internal.iter_mut(),
89 }
90 }
91
92 pub fn latest_entries(&self) -> LatestEntries<'_, 'a, Querier> {
95 LatestEntries {
96 internal: self.internal.iter(),
97 }
98 }
99
100 pub fn latest_entries_mut(&mut self) -> LatestEntriesMut<'_, 'a, Querier> {
103 LatestEntriesMut {
104 internal: self.internal.iter_mut(),
105 }
106 }
107}
108
109#[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#[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 pub fn entries(&self) -> Entries<'_, 'a, Querier> {
174 Entries {
175 internal: self.internal.iter(),
176 }
177 }
178
179 pub fn entries_mut(&mut self) -> EntriesMut<'_, 'a, Querier> {
181 EntriesMut {
182 internal: self.internal.iter_mut(),
183 }
184 }
185}
186
187#[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#[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 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 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}