brk_vec/variants/
lazy1.rs

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}