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#[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#[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 pub fn queriers(&self) -> MultiQueriers<'_, 'a, Querier> {
74 MultiQueriers {
75 internal: self.internal.values(),
76 }
77 }
78
79 pub fn queriers_mut(&mut self) -> MultiQueriersMut<'_, 'a, Querier> {
81 MultiQueriersMut {
82 internal: self.internal.values_mut(),
83 }
84 }
85
86 pub fn latest_queriers(&self) -> LatestQueriers<'_, 'a, Querier> {
88 LatestQueriers {
89 internal: self.internal.values(),
90 }
91 }
92
93 pub fn latest_queriers_mut(&mut self) -> LatestQueriersMut<'_, 'a, Querier> {
95 LatestQueriersMut {
96 internal: self.internal.values_mut(),
97 }
98 }
99}
100
101#[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#[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 pub fn queriers(&self) -> Queriers<'_, 'a, Querier> {
164 Queriers {
165 internal: self.internal.values(),
166 }
167 }
168
169 pub fn queriers_mut(&mut self) -> QueriersMut<'_, 'a, Querier> {
171 QueriersMut {
172 internal: self.internal.values_mut(),
173 }
174 }
175}
176
177#[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#[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 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 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}