difftreelog
feat array inheritance
in: master
1 file changed
crates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth176pub 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 }187189199 }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 }204214209 .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 }214232222 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 }227252228 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 }234260235 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 }241268251 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