minerva 0.2.0

Causal ordering for distributed systems
extern crate alloc;

use alloc::collections::btree_map;

/// Borrowing iterator over a [`VersionVector`](super::VersionVector)'s observed entries.
///
/// Yields `(station_id, counter)` pairs in ascending station order. Created by
/// [`VersionVector::iter`](super::VersionVector::iter) or by iterating `&VersionVector`.
///
/// Canonical form means every yielded counter is `>= 1`: stations at `0` are absent
/// and never appear.
#[derive(Debug, Clone)]
pub struct Iter<'a> {
    inner: btree_map::Iter<'a, u32, u64>,
}

impl<'a> Iter<'a> {
    pub(super) const fn new(inner: btree_map::Iter<'a, u32, u64>) -> Self {
        Self { inner }
    }
}

impl Iterator for Iter<'_> {
    type Item = (u32, u64);

    fn next(&mut self) -> Option<Self::Item> {
        self.inner
            .next()
            .map(|(&station, &counter)| (station, counter))
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        self.inner.size_hint()
    }
}

impl ExactSizeIterator for Iter<'_> {
    fn len(&self) -> usize {
        self.inner.len()
    }
}

impl core::iter::FusedIterator for Iter<'_> {}