cynic_parser/values/
iter.rs

1use std::{fmt, iter::FusedIterator};
2
3use crate::common::{IdOperations, IdRange, IdRangeIter};
4
5use super::ValueStoreId;
6
7/// Iterator for readers in the executable module
8///
9/// T indicates the type that will be yielded by the Iterator
10#[derive(Clone)]
11pub struct Iter<'a, T>
12where
13    T: ValueStoreReader<'a>,
14{
15    ids: IdRangeIter<T::Id>,
16    store: &'a super::ValueStore,
17}
18
19impl<'a, T> Iter<'a, T>
20where
21    T: ValueStoreReader<'a>,
22{
23    pub(crate) fn new(range: IdRange<T::Id>, document: &'a super::ValueStore) -> Self
24    where
25        T::Id: IdOperations,
26    {
27        Iter {
28            ids: range.into_iter(),
29            store: document,
30        }
31    }
32
33    pub fn ids(&self) -> IdRange<T::Id> {
34        self.ids.current_range()
35    }
36}
37
38pub trait ValueStoreReader<'a> {
39    type Id: ValueStoreId<Reader<'a> = Self>;
40}
41
42impl<'a, T> Iterator for Iter<'a, T>
43where
44    T: ValueStoreReader<'a>,
45    T::Id: IdOperations,
46{
47    type Item = <T::Id as ValueStoreId>::Reader<'a>;
48
49    fn next(&mut self) -> Option<Self::Item> {
50        Some(self.store.read(self.ids.next()?))
51    }
52
53    fn size_hint(&self) -> (usize, Option<usize>) {
54        self.ids.size_hint()
55    }
56}
57
58impl<'a, T> ExactSizeIterator for Iter<'a, T>
59where
60    T: ValueStoreReader<'a>,
61    T::Id: IdOperations,
62{
63}
64
65impl<'a, T> FusedIterator for Iter<'a, T>
66where
67    T: ValueStoreReader<'a>,
68    T::Id: IdOperations,
69{
70}
71
72impl<'a, T> DoubleEndedIterator for Iter<'a, T>
73where
74    T: ValueStoreReader<'a>,
75    T::Id: IdOperations,
76{
77    // Required method
78    fn next_back(&mut self) -> Option<Self::Item> {
79        Some(self.store.read(self.ids.next_back()?))
80    }
81}
82
83impl<'a, T> fmt::Debug for Iter<'a, T>
84where
85    T: ValueStoreReader<'a> + Copy,
86    Self: Iterator,
87    <Self as Iterator>::Item: fmt::Debug,
88{
89    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
90        f.debug_list().entries(self.clone()).finish()
91    }
92}