kserd/nav/
value.rs

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    /// The number of items.
34    pub fn len(&self) -> usize {
35        self.seq.len()
36    }
37
38    /// The iterator has no elements.
39    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    /// The number of items.
60    pub fn len(&self) -> usize {
61        self.values.len()
62    }
63
64    /// The iterator has no elements.
65    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    /// The number of items.
91    pub fn len(&self) -> usize {
92        self.values.len()
93    }
94
95    /// The iterator has no elements.
96    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}