1use gcmodule::{Cc, Trace};2use jrsonnet_interner::IStr;34use crate::{GcHashMap, LazyVal};56#[derive(Trace)]7#[force_tracking]8pub struct LayeredHashMapInternals {9 parent: Option<LayeredHashMap>,10 current: GcHashMap<IStr, LazyVal>,11}1213#[derive(Trace)]14pub struct LayeredHashMap(Cc<LayeredHashMapInternals>);1516impl LayeredHashMap {17 pub fn extend(self, new_layer: GcHashMap<IStr, LazyVal>) -> Self {18 Self(Cc::new(LayeredHashMapInternals {19 parent: Some(self),20 current: new_layer,21 }))22 }2324 pub fn get(&self, key: &IStr) -> Option<&LazyVal> {25 (self.0)26 .current27 .get(key)28 .or_else(|| self.0.parent.as_ref().and_then(|p| p.get(key)))29 }3031 pub fn contains_key(&self, key: &IStr) -> bool {32 (self.0).current.contains_key(key)33 || self34 .035 .parent36 .as_ref()37 .map(|p| p.contains_key(key))38 .unwrap_or(false)39 }40}4142impl Clone for LayeredHashMap {43 fn clone(&self) -> Self {44 Self(self.0.clone())45 }46}4748impl Default for LayeredHashMap {49 fn default() -> Self {50 Self(Cc::new(LayeredHashMapInternals {51 parent: None,52 current: GcHashMap::new(),53 }))54 }55}