Skip to main content

raphtory_core/utils/
iter.rs

1use ouroboros::self_referencing;
2pub use raphtory_api::iter::{BoxedLDIter, BoxedLIter};
3
4/// Iterator that returns elements from a locked object.
5#[self_referencing]
6pub struct GenLockedIter<'a, O, OUT> {
7    owner: O,
8    #[borrows(owner)]
9    #[covariant]
10    iter: BoxedLIter<'this, OUT>,
11    mark: std::marker::PhantomData<&'a O>,
12}
13
14impl<'a, O, OUT> Iterator for GenLockedIter<'a, O, OUT> {
15    type Item = OUT;
16
17    fn next(&mut self) -> Option<Self::Item> {
18        self.with_iter_mut(|iter| iter.next())
19    }
20
21    fn size_hint(&self) -> (usize, Option<usize>) {
22        self.with_iter(|iter| iter.size_hint())
23    }
24
25    fn nth(&mut self, n: usize) -> Option<Self::Item> {
26        self.with_iter_mut(|iter| iter.nth(n))
27    }
28}
29
30impl<'a, O, OUT> GenLockedIter<'a, O, OUT> {
31    pub fn from<'b>(owner: O, iter_fn: impl FnOnce(&O) -> BoxedLIter<OUT> + 'b) -> Self {
32        GenLockedIterBuilder {
33            owner,
34            iter_builder: |owner| iter_fn(owner),
35            mark: std::marker::PhantomData,
36        }
37        .build()
38    }
39}
40
41/// Double-ended iterator that returns elements from a locked object.
42#[self_referencing]
43pub struct GenLockedDIter<'a, O, OUT> {
44    owner: O,
45    #[borrows(owner)]
46    #[covariant]
47    iter: BoxedLDIter<'this, OUT>,
48    mark: std::marker::PhantomData<&'a O>,
49}
50
51impl<'a, O, OUT> GenLockedDIter<'a, O, OUT> {
52    pub fn from<'b>(owner: O, iter_fn: impl FnOnce(&O) -> BoxedLDIter<OUT> + 'b) -> Self {
53        GenLockedDIterBuilder {
54            owner,
55            iter_builder: |owner| iter_fn(owner),
56            mark: std::marker::PhantomData,
57        }
58        .build()
59    }
60}
61
62impl<'a, O, OUT> Iterator for GenLockedDIter<'a, O, OUT> {
63    type Item = OUT;
64
65    fn next(&mut self) -> Option<Self::Item> {
66        self.with_iter_mut(|iter| iter.next())
67    }
68
69    fn size_hint(&self) -> (usize, Option<usize>) {
70        self.with_iter(|iter| iter.size_hint())
71    }
72
73    fn nth(&mut self, n: usize) -> Option<Self::Item> {
74        self.with_iter_mut(|iter| iter.nth(n))
75    }
76}
77
78impl<'a, O, OUT> DoubleEndedIterator for GenLockedDIter<'a, O, OUT> {
79    fn next_back(&mut self) -> Option<Self::Item> {
80        self.with_iter_mut(|iter| iter.next_back())
81    }
82}