Skip to main content

raphtory_core/utils/
iter.rs

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