arch_pkg_db/multi/iter/
owned.rs

1use crate::{
2    multi::{MultiQuerier, MultiQueryDatabase, WithVersion},
3    value::RepositoryName,
4};
5use arch_pkg_text::value::Name;
6use core::iter::FusedIterator;
7use std::collections::hash_map;
8
9/// [Iterator] over all pairs of [package names](Name) and owned queriers from a [`MultiQueryDatabase`].
10#[derive(Debug)]
11pub struct MultiOwnedEntries<'query, Querier> {
12    internal: hash_map::IntoIter<&'query str, MultiQuerier<'query, Querier>>,
13}
14
15impl<'query, Querier> Iterator for MultiOwnedEntries<'query, Querier> {
16    type Item = (Name<'query>, MultiQuerier<'query, Querier>);
17
18    fn next(&mut self) -> Option<Self::Item> {
19        let (name, querier) = self.internal.next()?;
20        Some((Name(name), querier))
21    }
22
23    fn size_hint(&self) -> (usize, Option<usize>) {
24        self.internal.size_hint()
25    }
26
27    fn count(self) -> usize {
28        self.internal.count()
29    }
30}
31
32impl<Querier> ExactSizeIterator for MultiOwnedEntries<'_, Querier> {
33    fn len(&self) -> usize {
34        self.internal.len()
35    }
36}
37
38impl<Querier> FusedIterator for MultiOwnedEntries<'_, Querier> {}
39
40impl<'a, Querier> IntoIterator for MultiQueryDatabase<'a, Querier> {
41    type IntoIter = MultiOwnedEntries<'a, Querier>;
42    type Item = (Name<'a>, MultiQuerier<'a, Querier>);
43    fn into_iter(self) -> Self::IntoIter {
44        MultiOwnedEntries {
45            internal: self.internal.into_iter(),
46        }
47    }
48}
49
50/// [Iterator] over all pairs of [repository names](RepositoryName) and owned queriers from a [`MultiQuerier`].
51#[derive(Debug)]
52pub struct OwnedEntries<'query, Querier> {
53    internal: hash_map::IntoIter<&'query str, WithVersion<'query, Querier>>,
54}
55
56impl<'query, Querier> Iterator for OwnedEntries<'query, Querier> {
57    type Item = (RepositoryName<'query>, WithVersion<'query, Querier>);
58
59    fn next(&mut self) -> Option<Self::Item> {
60        let (name, querier) = self.internal.next()?;
61        Some((RepositoryName(name), querier))
62    }
63
64    fn size_hint(&self) -> (usize, Option<usize>) {
65        self.internal.size_hint()
66    }
67
68    fn count(self) -> usize {
69        self.internal.count()
70    }
71}
72
73impl<Querier> ExactSizeIterator for OwnedEntries<'_, Querier> {
74    fn len(&self) -> usize {
75        self.internal.len()
76    }
77}
78
79impl<Querier> FusedIterator for OwnedEntries<'_, Querier> {}
80
81impl<'a, Querier> IntoIterator for MultiQuerier<'a, Querier> {
82    type IntoIter = OwnedEntries<'a, Querier>;
83    type Item = (RepositoryName<'a>, WithVersion<'a, Querier>);
84    fn into_iter(self) -> Self::IntoIter {
85        OwnedEntries {
86            internal: self.internal.into_iter(),
87        }
88    }
89}