cynic_parser/values/
iter.rs1use std::{fmt, iter::FusedIterator};
2
3use crate::common::{IdOperations, IdRange, IdRangeIter};
4
5use super::ValueStoreId;
6
7#[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 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}