use core::fmt;
type Delegate<'a, K, V> = std::slice::Iter<'a, (K, V)>;
pub struct Keys<'a, K, V> {
delegate: Delegate<'a, K, V>,
}
impl<'a, K, V> Keys<'a, K, V> {
pub(super) fn from_delegate(delegate: Delegate<'a, K, V>) -> Self {
Self { delegate }
}
}
impl<'a, K, V> Iterator for Keys<'a, K, V> {
type Item = &'a K;
fn next(&mut self) -> Option<Self::Item> {
self.delegate.next().map(|(k, _)| k)
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.delegate.size_hint()
}
fn count(self) -> usize
where
Self: Sized,
{
self.delegate.count()
}
fn last(self) -> Option<Self::Item>
where
Self: Sized,
{
self.delegate.last().map(|(k, _)| k)
}
fn nth(&mut self, n: usize) -> Option<Self::Item> {
self.delegate.nth(n).map(|(k, _)| k)
}
}
impl<'a, K, V> std::iter::FusedIterator for Keys<'a, K, V> {}
impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {
fn len(&self) -> usize {
self.delegate.len()
}
}
impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> {
fn next_back(&mut self) -> Option<Self::Item> {
self.delegate.next_back().map(|(k, _)| k)
}
fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
self.delegate.nth_back(n).map(|(k, _)| k)
}
}
impl<'a, K: fmt::Debug, V: fmt::Debug> fmt::Debug for Keys<'a, K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("Keys")
.field(&self.delegate.as_slice())
.finish()
}
}
impl<'a, K, V> Clone for Keys<'a, K, V> {
#[inline]
fn clone(&self) -> Self {
Self {
delegate: self.delegate.clone(),
}
}
}