raphtory-core 0.18.5

Raphtory core components
Documentation
use ouroboros::self_referencing;
pub use raphtory_api::iter::{BoxedLDIter, BoxedLIter};

/// Iterator that returns elements from a locked object.
#[self_referencing]
pub struct GenLockedIter<'a, O, OUT> {
    owner: O,
    #[borrows(owner)]
    #[covariant]
    iter: BoxedLIter<'this, OUT>,
    mark: std::marker::PhantomData<&'a O>,
}

impl<'a, O, OUT> Iterator for GenLockedIter<'a, O, OUT> {
    type Item = OUT;

    fn next(&mut self) -> Option<Self::Item> {
        self.with_iter_mut(|iter| iter.next())
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        self.with_iter(|iter| iter.size_hint())
    }

    fn nth(&mut self, n: usize) -> Option<Self::Item> {
        self.with_iter_mut(|iter| iter.nth(n))
    }
}

impl<'a, O, OUT> GenLockedIter<'a, O, OUT> {
    pub fn from<'b>(owner: O, iter_fn: impl FnOnce(&O) -> BoxedLIter<OUT> + 'b) -> Self {
        GenLockedIterBuilder {
            owner,
            iter_builder: |owner| iter_fn(owner),
            mark: std::marker::PhantomData,
        }
        .build()
    }
}

/// Double-ended iterator that returns elements from a locked object.
#[self_referencing]
pub struct GenLockedDIter<'a, O, OUT> {
    owner: O,
    #[borrows(owner)]
    #[covariant]
    iter: BoxedLDIter<'this, OUT>,
    mark: std::marker::PhantomData<&'a O>,
}

impl<'a, O, OUT> GenLockedDIter<'a, O, OUT> {
    pub fn from<'b>(owner: O, iter_fn: impl FnOnce(&O) -> BoxedLDIter<OUT> + 'b) -> Self {
        GenLockedDIterBuilder {
            owner,
            iter_builder: |owner| iter_fn(owner),
            mark: std::marker::PhantomData,
        }
        .build()
    }
}

impl<'a, O, OUT> Iterator for GenLockedDIter<'a, O, OUT> {
    type Item = OUT;

    fn next(&mut self) -> Option<Self::Item> {
        self.with_iter_mut(|iter| iter.next())
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        self.with_iter(|iter| iter.size_hint())
    }

    fn nth(&mut self, n: usize) -> Option<Self::Item> {
        self.with_iter_mut(|iter| iter.nth(n))
    }
}

impl<'a, O, OUT> DoubleEndedIterator for GenLockedDIter<'a, O, OUT> {
    fn next_back(&mut self) -> Option<Self::Item> {
        self.with_iter_mut(|iter| iter.next_back())
    }
}