git.delta.rocks / jrsonnet / refs/commits / 2634495e4929

difftreelog

feat array inheritance

Yaroslav Bolyukin2021-01-24parent: #c437de1.patch.diff
in: master

1 file changed

modifiedcrates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth
176pub enum ArrValue {176pub enum ArrValue {
177 Lazy(Rc<Vec<LazyVal>>),177 Lazy(Rc<Vec<LazyVal>>),
178 Eager(Rc<Vec<Val>>),178 Eager(Rc<Vec<Val>>),
179 Extended(Box<(ArrValue, ArrValue)>),
179}180}
180impl ArrValue {181impl ArrValue {
181 pub fn len(&self) -> usize {182 pub fn len(&self) -> usize {
182 match self {183 match self {
183 ArrValue::Lazy(l) => l.len(),184 ArrValue::Lazy(l) => l.len(),
184 ArrValue::Eager(e) => e.len(),185 ArrValue::Eager(e) => e.len(),
186 ArrValue::Extended(v) => v.0.len() + v.1.len(),
185 }187 }
186 }188 }
187189
199 }201 }
200 }202 }
201 ArrValue::Eager(vec) => Ok(vec.get(index).cloned()),203 ArrValue::Eager(vec) => Ok(vec.get(index).cloned()),
204 ArrValue::Extended(v) => {
205 let a_len = v.0.len();
206 if a_len > index {
207 v.0.get(index)
208 } else {
209 v.1.get(index - a_len)
210 }
211 }
202 }212 }
203 }213 }
204214
209 .get(index)219 .get(index)
210 .cloned()220 .cloned()
211 .map(|val| LazyVal::new_resolved(val)),221 .map(|val| LazyVal::new_resolved(val)),
222 ArrValue::Extended(v) => {
223 let a_len = v.0.len();
224 if a_len > index {
225 v.0.get_lazy(index)
226 } else {
227 v.1.get_lazy(index - a_len)
228 }
229 }
212 }230 }
213 }231 }
214232
222 Rc::new(out)240 Rc::new(out)
223 }241 }
224 ArrValue::Eager(vec) => vec.clone(),242 ArrValue::Eager(vec) => vec.clone(),
243 ArrValue::Extended(v) => {
244 let mut out = Vec::with_capacity(self.len());
245 for item in self.iter() {
246 out.push(item?);
247 }
248 Rc::new(out)
249 }
225 })250 })
226 }251 }
227252
228 pub fn iter(&self) -> impl DoubleEndedIterator<Item = Result<Val>> + '_ {253 pub fn iter(&self) -> impl DoubleEndedIterator<Item = Result<Val>> + '_ {
229 (0..self.len()).map(move |idx| match self {254 (0..self.len()).map(move |idx| match self {
230 ArrValue::Lazy(l) => l[idx].evaluate(),255 ArrValue::Lazy(l) => l[idx].evaluate(),
231 ArrValue::Eager(e) => Ok(e[idx].clone()),256 ArrValue::Eager(e) => Ok(e[idx].clone()),
257 ArrValue::Extended(_) => self.get(idx).map(|e| e.unwrap()),
232 })258 })
233 }259 }
234260
235 pub fn iter_lazy(&self) -> impl DoubleEndedIterator<Item = LazyVal> + '_ {261 pub fn iter_lazy(&self) -> impl DoubleEndedIterator<Item = LazyVal> + '_ {
236 (0..self.len()).map(move |idx| match self {262 (0..self.len()).map(move |idx| match self {
237 ArrValue::Lazy(l) => l[idx].clone(),263 ArrValue::Lazy(l) => l[idx].clone(),
238 ArrValue::Eager(e) => LazyVal::new_resolved(e[idx].clone()),264 ArrValue::Eager(e) => LazyVal::new_resolved(e[idx].clone()),
265 ArrValue::Extended(_) => self.get_lazy(idx).unwrap(),
239 })266 })
240 }267 }
241268
251 out.reverse();278 out.reverse();
252 Self::Eager(Rc::new(out))279 Self::Eager(Rc::new(out))
253 }280 }
281 ArrValue::Extended(b) => ArrValue::Extended(Box::new((b.1.reversed(), b.0.reversed()))),
254 }282 }
255 }283 }
256284