partiql_value/value/
iter.rs

1use crate::{
2    BagIntoIterator, BagIter, ListIntoIterator, ListIter, Value, VariantIntoIterator, VariantIter,
3};
4
5pub enum ValueIter<'a> {
6    List(ListIter<'a>),
7    Bag(BagIter<'a>),
8    Variant(VariantIter<'a>),
9    Single(Option<&'a Value>),
10}
11
12impl<'a> Iterator for ValueIter<'a> {
13    type Item = &'a Value;
14
15    #[inline]
16    fn next(&mut self) -> Option<Self::Item> {
17        match self {
18            ValueIter::List(list) => list.next(),
19            ValueIter::Bag(bag) => bag.next(),
20            ValueIter::Variant(_doc) => {
21                todo!("next for ValueIter::Variant")
22            }
23            ValueIter::Single(v) => v.take(),
24        }
25    }
26
27    #[inline]
28    fn size_hint(&self) -> (usize, Option<usize>) {
29        match self {
30            ValueIter::List(list) => list.size_hint(),
31            ValueIter::Bag(bag) => bag.size_hint(),
32            ValueIter::Variant(_doc) => {
33                todo!("size_hint for ValueIter::Variant")
34            }
35            ValueIter::Single(_) => (1, Some(1)),
36        }
37    }
38}
39
40impl IntoIterator for Value {
41    type Item = Value;
42    type IntoIter = ValueIntoIterator;
43
44    #[inline]
45    fn into_iter(self) -> ValueIntoIterator {
46        match self {
47            Value::List(list) => ValueIntoIterator::List(list.into_iter()),
48            Value::Bag(bag) => ValueIntoIterator::Bag(bag.into_iter()),
49            Value::Variant(doc) => ValueIntoIterator::Variant(doc.into_iter()),
50            other => ValueIntoIterator::Single(Some(other)),
51        }
52    }
53}
54
55pub enum ValueIntoIterator {
56    List(ListIntoIterator),
57    Bag(BagIntoIterator),
58    Variant(VariantIntoIterator),
59    Single(Option<Value>),
60}
61
62impl Iterator for ValueIntoIterator {
63    type Item = Value;
64
65    #[inline]
66    fn next(&mut self) -> Option<Self::Item> {
67        match self {
68            ValueIntoIterator::List(list) => list.next(),
69            ValueIntoIterator::Bag(bag) => bag.next(),
70            ValueIntoIterator::Variant(doc) => doc
71                .next()
72                .map(|d| Value::Variant(Box::new(d.expect("Variant iteration")))),
73            ValueIntoIterator::Single(v) => v.take(),
74        }
75    }
76
77    #[inline]
78    fn size_hint(&self) -> (usize, Option<usize>) {
79        match self {
80            ValueIntoIterator::List(list) => list.size_hint(),
81            ValueIntoIterator::Bag(bag) => bag.size_hint(),
82            ValueIntoIterator::Variant(doc) => doc.size_hint(),
83            ValueIntoIterator::Single(_) => (1, Some(1)),
84        }
85    }
86}