1use core::panic;
2use std::marker::PhantomData;
3
4use crate::{
5 AnyCollectableVec, AnyIterableVec, AnyVec, BaseVecIterator, BoxedAnyIterableVec,
6 BoxedVecIterator, CollectableVec, Result, StoredIndex, StoredType, Value, Version,
7};
8
9pub type ComputeFrom1<I, T, S1I, S1T> =
10 for<'a> fn(I, &mut dyn BaseVecIterator<Item = (S1I, Value<'a, S1T>)>) -> Option<T>;
11
12#[derive(Clone)]
13pub struct LazyVecFrom1<I, T, S1I, S1T> {
14 name: String,
15 version: Version,
16 source: BoxedAnyIterableVec<S1I, S1T>,
17 compute: ComputeFrom1<I, T, S1I, S1T>,
18 phantom: PhantomData<I>,
19}
20
21impl<I, T, S1I, S1T> LazyVecFrom1<I, T, S1I, S1T>
22where
23 I: StoredIndex,
24 T: StoredType,
25 S1I: StoredIndex,
26 S1T: StoredType,
27{
28 pub fn init(
29 name: &str,
30 version: Version,
31 source: BoxedAnyIterableVec<S1I, S1T>,
32 compute: ComputeFrom1<I, T, S1I, S1T>,
33 ) -> Self {
34 if source.index_type_to_string() != I::to_string() {
35 panic!("Should have same index");
36 }
37
38 Self {
39 name: name.to_owned(),
40 version,
41 source,
42 compute,
43 phantom: PhantomData,
44 }
45 }
46
47 fn version(&self) -> Version {
48 self.version
49 }
50}
51
52pub struct LazyVecFrom1Iterator<'a, I, T, S1I, S1T> {
53 lazy: &'a LazyVecFrom1<I, T, S1I, S1T>,
54 source: BoxedVecIterator<'a, S1I, S1T>,
55 index: usize,
56}
57
58impl<'a, I, T, S1I, S1T> Iterator for LazyVecFrom1Iterator<'a, I, T, S1I, S1T>
59where
60 I: StoredIndex,
61 T: StoredType + 'a,
62 S1I: StoredIndex,
63 S1T: StoredType,
64{
65 type Item = (I, Value<'a, T>);
66
67 fn next(&mut self) -> Option<Self::Item> {
68 if self.index >= self.len() {
69 return None;
70 }
71 let index = I::from(self.index);
72 let opt = (self.lazy.compute)(index, &mut *self.source).map(|v| (index, Value::Owned(v)));
73 if opt.is_some() {
74 self.index += 1;
75 }
76 opt
77 }
78}
79
80impl<I, T, S1I, S1T> BaseVecIterator for LazyVecFrom1Iterator<'_, I, T, S1I, S1T>
81where
82 I: StoredIndex,
83 T: StoredType,
84 S1I: StoredIndex,
85 S1T: StoredType,
86{
87 #[inline]
88 fn mut_index(&mut self) -> &mut usize {
89 &mut self.index
90 }
91
92 #[inline]
93 fn len(&self) -> usize {
94 self.source.len()
95 }
96}
97
98impl<'a, I, T, S1I, S1T> IntoIterator for &'a LazyVecFrom1<I, T, S1I, S1T>
99where
100 I: StoredIndex,
101 T: StoredType + 'a,
102 S1I: StoredIndex,
103 S1T: StoredType,
104{
105 type Item = (I, Value<'a, T>);
106 type IntoIter = LazyVecFrom1Iterator<'a, I, T, S1I, S1T>;
107
108 fn into_iter(self) -> Self::IntoIter {
109 LazyVecFrom1Iterator {
110 lazy: self,
111 source: self.source.iter(),
112 index: 0,
113 }
114 }
115}
116
117impl<I, T, S1I, S1T> AnyVec for LazyVecFrom1<I, T, S1I, S1T>
118where
119 I: StoredIndex,
120 T: StoredType,
121 S1I: StoredIndex,
122 S1T: StoredType,
123{
124 fn version(&self) -> Version {
125 self.version()
126 }
127
128 fn name(&self) -> String {
129 self.name.clone()
130 }
131
132 fn index_type_to_string(&self) -> &str {
133 I::to_string()
134 }
135
136 fn len(&self) -> usize {
137 self.source.len()
138 }
139
140 fn modified_time(&self) -> Result<std::time::Duration> {
141 self.source.modified_time()
142 }
143}
144
145impl<I, T, S1I, S1T> AnyIterableVec<I, T> for LazyVecFrom1<I, T, S1I, S1T>
146where
147 I: StoredIndex,
148 T: StoredType,
149 S1I: StoredIndex,
150 S1T: StoredType,
151{
152 fn boxed_iter<'a>(&'a self) -> BoxedVecIterator<'a, I, T>
153 where
154 T: 'a,
155 {
156 Box::new(self.into_iter())
157 }
158}
159
160impl<I, T, S1I, S1T> AnyCollectableVec for LazyVecFrom1<I, T, S1I, S1T>
161where
162 I: StoredIndex,
163 T: StoredType,
164 S1I: StoredIndex,
165 S1T: StoredType,
166{
167 fn collect_range_serde_json(
168 &self,
169 from: Option<i64>,
170 to: Option<i64>,
171 ) -> Result<Vec<serde_json::Value>> {
172 CollectableVec::collect_range_serde_json(self, from, to)
173 }
174}