raphtory_core/utils/
iter.rs1use ouroboros::self_referencing;
2pub use raphtory_api::iter::{BoxedLDIter, BoxedLIter};
3
4#[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#[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}