Skip to main content

partiql_value/value/
iter.rs

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