1use crate::{code_map::Mapped, CodeMap, Value};
2
3pub type Array = Vec<Value>;
5
6pub trait JsonArray {
8 fn iter_mapped<'m>(&self, code_map: &'m CodeMap, offset: usize) -> IterMapped<'_, 'm>;
9}
10
11impl JsonArray for [Value] {
12 fn iter_mapped<'m>(&self, code_map: &'m CodeMap, offset: usize) -> IterMapped<'_, 'm> {
13 IterMapped {
14 items: self.iter(),
15 code_map,
16 offset: offset + 1,
17 }
18 }
19}
20
21impl JsonArray for Vec<Value> {
22 fn iter_mapped<'m>(&self, code_map: &'m CodeMap, offset: usize) -> IterMapped<'_, 'm> {
23 IterMapped {
24 items: self.iter(),
25 code_map,
26 offset: offset + 1,
27 }
28 }
29}
30
31pub struct IterMapped<'a, 'm> {
32 items: std::slice::Iter<'a, Value>,
33 code_map: &'m CodeMap,
34 offset: usize,
35}
36
37impl<'a, 'm> Iterator for IterMapped<'a, 'm> {
38 type Item = Mapped<&'a Value>;
39
40 fn next(&mut self) -> Option<Self::Item> {
41 self.items.next().map(|item| {
42 let offset = self.offset;
43 self.offset += self.code_map.get(self.offset).unwrap().volume;
44 Mapped::new(offset, item)
45 })
46 }
47}