From 9e238ddaaa503210b8e079429a978edeccdef99c Mon Sep 17 00:00:00 2001 From: Ben Bridle Date: Mon, 3 Mar 2025 17:03:15 +1300 Subject: Add Tracked type The Tracked type allows tagging an arbitrary type with a SourceSpan. --- src/locators/tracked.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/locators/tracked.rs (limited to 'src/locators/tracked.rs') diff --git a/src/locators/tracked.rs b/src/locators/tracked.rs new file mode 100644 index 0000000..091ee52 --- /dev/null +++ b/src/locators/tracked.rs @@ -0,0 +1,58 @@ +use crate::*; + +#[derive(Clone)] +pub struct Tracked { + pub source: SourceSpan, + pub value: T, +} + +impl Tracked { + pub fn from(value: T, source: SourceSpan) -> Self { + Self { source, value } + } +} + +impl std::ops::Deref for Tracked { + type Target = T; + fn deref(&self) -> &T { + &self.value + } +} + +impl std::ops::DerefMut for Tracked { + fn deref_mut(&mut self) -> &mut T { + &mut self.value + } +} + +impl AsRef for Tracked { + fn as_ref(&self) -> &T { + &self.value + } +} + +impl AsMut for Tracked { + fn as_mut(&mut self) -> &mut T { + &mut self.value + } +} + +impl std::fmt::Display for Tracked { + fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + write!(f, "{}", self.value) + } +} + +impl std::fmt::Debug for Tracked { + fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + write!(f, "{:?}", self.value) + } +} + +impl PartialEq for Tracked { + fn eq(&self, other: &Tracked) -> bool { + self.value.eq(&other.value) + } +} + +impl Eq for Tracked {} -- cgit v1.2.3-70-g09d2