1use super::*;
2
3impl<'a, 'k> NodeInner<'a, 'k> {
4 pub fn value<'nav, 'node>(
5 &'node self,
6 navigator: &'nav Navigator<'a, 'k>,
7 ) -> NodeValue<'a, 'k, 'nav, 'node> {
8 match &self.kserd.val {
9 Value::Tuple(_) => NodeValue::Tuple(SeqIter {
10 seq: self.value_children.iter(),
11 nav: navigator,
12 }),
13 Value::Cntr(v) => NodeValue::Cntr(NamedIter {
14 names: v.keys(),
15 values: self.value_children.iter(),
16 nav: navigator,
17 }),
18 Value::Seq(_) => NodeValue::Seq(SeqIter {
19 seq: self.value_children.iter(),
20 nav: navigator,
21 }),
22 Value::Map(_) => NodeValue::Map(KeyedIter {
23 keys: self.key_children.iter(),
24 values: self.value_children.iter(),
25 nav: navigator,
26 }),
27 _ => NodeValue::Primitive,
28 }
29 }
30}
31
32impl<'a, 'k, 'nav, 'node> SeqIter<'a, 'k, 'nav, 'node> {
33 pub fn len(&self) -> usize {
35 self.seq.len()
36 }
37
38 pub fn is_empty(&self) -> bool {
40 self.seq.as_ref().is_empty()
41 }
42}
43
44impl<'a: 'node, 'k: 'node, 'nav: 'node, 'node> Iterator for SeqIter<'a, 'k, 'nav, 'node> {
45 type Item = Node<'a, 'k, 'nav, 'node>;
46
47 fn next(&mut self) -> Option<Node<'a, 'k, 'nav, 'node>> {
48 self.seq
49 .next()
50 .and_then(|&idx| self.nav.inner.get(idx))
51 .map(|node| Node {
52 node,
53 nav: self.nav,
54 })
55 }
56}
57
58impl<'a, 'k, 'nav, 'node> NamedIter<'a, 'k, 'nav, 'node> {
59 pub fn len(&self) -> usize {
61 self.values.len()
62 }
63
64 pub fn is_empty(&self) -> bool {
66 self.values.as_ref().is_empty()
67 }
68}
69
70impl<'a: 'node, 'k: 'node, 'nav: 'node, 'node> Iterator for NamedIter<'a, 'k, 'nav, 'node> {
71 type Item = (&'node Kstr<'k>, Node<'a, 'k, 'nav, 'node>);
72
73 fn next(&mut self) -> Option<(&'node Kstr<'k>, Node<'a, 'k, 'nav, 'node>)> {
74 if let Some(name) = self.names.next() {
75 self.values
76 .next()
77 .and_then(|&idx| self.nav.inner.get(idx))
78 .map(|node| Node {
79 node,
80 nav: self.nav,
81 })
82 .map(|node| (name, node))
83 } else {
84 None
85 }
86 }
87}
88
89impl<'a, 'k, 'nav, 'node> KeyedIter<'a, 'k, 'nav, 'node> {
90 pub fn len(&self) -> usize {
92 self.values.len()
93 }
94
95 pub fn is_empty(&self) -> bool {
97 self.values.as_ref().is_empty()
98 }
99}
100
101impl<'a: 'node, 'k: 'node, 'nav: 'node, 'node> Iterator for KeyedIter<'a, 'k, 'nav, 'node> {
102 type Item = (Node<'a, 'k, 'nav, 'node>, Node<'a, 'k, 'nav, 'node>);
103
104 fn next(&mut self) -> Option<(Node<'a, 'k, 'nav, 'node>, Node<'a, 'k, 'nav, 'node>)> {
105 let key = self
106 .keys
107 .next()
108 .and_then(|&idx| self.nav.inner.get(idx))
109 .map(|node| Node {
110 node,
111 nav: self.nav,
112 });
113 if let Some(key) = key {
114 self.values
115 .next()
116 .and_then(|&idx| self.nav.inner.get(idx))
117 .map(|node| Node {
118 node,
119 nav: self.nav,
120 })
121 .map(|value| (key, value))
122 } else {
123 None
124 }
125 }
126}