partiql_value/value/
iter.rs1use 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}