raphtory_core/utils/
iter.rs1use 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}