From 91108e4246a46dfb9c362e951fea947497cf75d4 Mon Sep 17 00:00:00 2001 From: Лач Date: Fri, 26 Jun 2020 07:49:37 +0000 Subject: [PATCH] perf(evaluator): drop lazy closure after evaluation --- --- a/crates/jsonnet-evaluator/src/val.rs +++ b/crates/jsonnet-evaluator/src/val.rs @@ -10,35 +10,26 @@ rc::Rc, }; -struct LazyValInternals { - pub f: Option Result>>, - pub cached: RefCell>, +enum LazyValInternals { + Computed(Val), + Waiting(Box Result>), } #[derive(Clone)] -pub struct LazyVal(Rc); +pub struct LazyVal(Rc>); impl LazyVal { pub fn new(f: Box Result>) -> Self { - LazyVal(Rc::new(LazyValInternals { - f: Some(f), - cached: RefCell::new(None), - })) + LazyVal(Rc::new(RefCell::new(LazyValInternals::Waiting(f)))) } pub fn new_resolved(val: Val) -> Self { - LazyVal(Rc::new(LazyValInternals { - f: None, - cached: RefCell::new(Some(val)), - })) + LazyVal(Rc::new(RefCell::new(LazyValInternals::Computed(val)))) } pub fn evaluate(&self) -> Result { - { - let cached = self.0.cached.borrow(); - if cached.is_some() { - return Ok(cached.clone().unwrap()); - } - } - let result = (self.0.f.as_ref().unwrap())()?; - self.0.cached.borrow_mut().replace(result.clone()); - Ok(result) + let new_value = match &*self.0.borrow() { + LazyValInternals::Computed(v) => return Ok(v.clone()), + LazyValInternals::Waiting(f) => f()?, + }; + *self.0.borrow_mut() = LazyValInternals::Computed(new_value.clone()); + Ok(new_value) } } @@ -56,11 +47,7 @@ } impl Debug for LazyVal { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if self.0.cached.borrow().is_some() { - write!(f, "{:?}", self.0.cached.borrow().clone().unwrap()) - } else { - write!(f, "Lazy") - } + write!(f, "Lazy") } } impl PartialEq for LazyVal { -- gitstuff