use crate::prelude::*; pub trait ValueClone { fn deep_clone(&self) -> Self; fn shallow_clone(&self) -> Self; } impl ValueClone for Value { fn deep_clone(&self) -> Self { use Value as V; match self { V::List(l) => V::List(l.deep_clone()), V::Table(t) => V::Table(t.deep_clone()), V::Matrix(m) => V::Matrix(m.deep_clone()), _ => self.clone() } } fn shallow_clone(&self) -> Self { use Value as V; match self { V::List(l) => V::List(l.shallow_clone()), V::Table(t) => V::Table(t.shallow_clone()), V::Matrix(m) => V::Matrix(m.shallow_clone()), _ => self.clone() } } } impl ValueClone for Vec<Value> { fn deep_clone(&self) -> Self { let mut vals = Vec::new(); for val in self { vals.push(val.deep_clone()) } vals } fn shallow_clone(&self) -> Self { self.clone() } } impl ValueClone for Matrix { fn deep_clone(&self) -> Self { let values = self.values.deep_clone(); Self::new(self.domain, self.codomain, values) } fn shallow_clone(&self) -> Self { let values = self.values.shallow_clone(); Self::new(self.domain, self.codomain, values) } }