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