1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use crate::index::{
config::{IndexTypeUnwrap, IndexTypeWrap},
tree::nodes::Value,
};
use std::vec::IntoIter;
pub struct ValueIter<V> {
value: Option<IntoIter<V>>,
}
impl<V> From<Value<V::Wrapper>> for ValueIter<V>
where
V: IndexTypeWrap,
V::Wrapper: IndexTypeUnwrap<Wrapped = V>,
{
fn from(val: Value<V::Wrapper>) -> Self {
ValueIter {
value: Some(val.into_iter().map(|v| v.unwrap()).collect::<Vec<_>>().into_iter()),
}
}
}
impl<V> From<Option<Value<V::Wrapper>>> for ValueIter<V>
where
V: IndexTypeWrap,
V::Wrapper: IndexTypeUnwrap<Wrapped = V>,
{
fn from(val: Option<Value<V::Wrapper>>) -> Self {
ValueIter {
value: val.map(|v| v.into_iter().map(|uv| uv.unwrap()).collect::<Vec<_>>().into_iter()),
}
}
}
impl<V> Iterator for ValueIter<V> {
type Item = V;
fn next(&mut self) -> Option<Self::Item> {
match &mut self.value {
Some(i) => i.next(),
None => None,
}
}
}
impl<V> ExactSizeIterator for ValueIter<V> {
fn len(&self) -> usize {
match &self.value {
Some(i) => i.len(),
None => 0,
}
}
}
impl<V> DoubleEndedIterator for ValueIter<V> {
fn next_back(&mut self) -> Option<Self::Item> {
match &mut self.value {
Some(i) => i.next_back(),
None => None,
}
}
}