git.delta.rocks / jrsonnet / refs/commits / 321e7ee3e21c

difftreelog

source

crates/jrsonnet-evaluator/src/map.rs1.1 KiBsourcehistory
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}