git.delta.rocks / jrsonnet / refs/commits / bde2637fa85f

difftreelog

source

crates/jrsonnet-evaluator/src/map.rs1.3 KiBsourcehistory
1use jrsonnet_gcmodule::{Cc, Trace};2use jrsonnet_interner::IStr;34use crate::{GcHashMap, Thunk, Val};56#[derive(Trace)]7#[trace(tracking(force))]8pub struct LayeredHashMapInternals {9	parent: Option<LayeredHashMap>,10	current: GcHashMap<IStr, Thunk<Val>>,11}1213#[derive(Trace)]14pub struct LayeredHashMap(Cc<LayeredHashMapInternals>);1516impl LayeredHashMap {17	pub fn iter_keys(self, mut handler: impl FnMut(IStr)) {18		for (k, _) in self.0.current.iter() {19			handler(k.clone());20		}21		if let Some(parent) = self.0.parent.clone() {22			parent.iter_keys(handler);23		}24	}2526	pub fn extend(self, new_layer: GcHashMap<IStr, Thunk<Val>>) -> Self {27		Self(Cc::new(LayeredHashMapInternals {28			parent: Some(self),29			current: new_layer,30		}))31	}3233	pub fn get(&self, key: &IStr) -> Option<&Thunk<Val>> {34		(self.0)35			.current36			.get(key)37			.or_else(|| self.0.parent.as_ref().and_then(|p| p.get(key)))38	}3940	pub fn contains_key(&self, key: &IStr) -> bool {41		(self.0).current.contains_key(key)42			|| self43				.044				.parent45				.as_ref()46				.map_or(false, |p| p.contains_key(key))47	}48}4950impl Clone for LayeredHashMap {51	fn clone(&self) -> Self {52		Self(self.0.clone())53	}54}5556impl Default for LayeredHashMap {57	fn default() -> Self {58		Self(Cc::new(LayeredHashMapInternals {59			parent: None,60			current: GcHashMap::new(),61		}))62	}63}