arch_pkg_db/multi/iter/
names.rs

1use crate::multi::{MultiQuerier, MultiQueryDatabase, MultiQueryDatabaseLatest};
2use arch_pkg_text::value::Name;
3use core::iter::FusedIterator;
4use core::ops::Deref;
5use std::collections::hash_map::Keys;
6
7/// [Iterator] over all [package names](Name) in a [`MultiQueryDatabase`].
8#[derive(Debug, Clone)]
9pub struct Names<'r, 'query, Querier> {
10    internal: Keys<'r, &'query str, MultiQuerier<'query, Querier>>,
11}
12
13impl<'query, Querier> Iterator for Names<'_, 'query, Querier> {
14    type Item = Name<'query>;
15
16    fn next(&mut self) -> Option<Self::Item> {
17        self.internal.next().copied().map(Name)
18    }
19
20    fn size_hint(&self) -> (usize, Option<usize>) {
21        self.internal.size_hint()
22    }
23
24    fn count(self) -> usize {
25        self.internal.count()
26    }
27}
28
29impl<Querier> ExactSizeIterator for Names<'_, '_, Querier> {
30    fn len(&self) -> usize {
31        self.internal.len()
32    }
33}
34
35impl<Querier> FusedIterator for Names<'_, '_, Querier> {}
36
37impl<'a, Querier> MultiQueryDatabase<'a, Querier> {
38    /// Get an iterator over all [package names](Name).
39    pub fn names(&self) -> Names<'_, 'a, Querier> {
40        Names {
41            internal: self.internal.keys(),
42        }
43    }
44}
45
46impl<Ref> MultiQueryDatabaseLatest<Ref> {
47    /// Get an iterator over all [package names](Name).
48    pub fn names<'a, Querier>(&self) -> Names<'_, 'a, Querier>
49    where
50        Ref: Deref<Target = MultiQueryDatabase<'a, Querier>>,
51    {
52        self.base.names()
53    }
54}