summaryrefslogtreecommitdiff
path: root/src/tokens/tracked.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tokens/tracked.rs')
-rw-r--r--src/tokens/tracked.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/tokens/tracked.rs b/src/tokens/tracked.rs
new file mode 100644
index 0000000..049c8f8
--- /dev/null
+++ b/src/tokens/tracked.rs
@@ -0,0 +1,47 @@
+use crate::*;
+
+
+#[derive(Clone)]
+pub struct Tracked<T> {
+ pub source: SourceSpan,
+ pub value: T,
+}
+
+impl<T> Tracked<T> {
+ pub fn from(value: T, source: &SourceSpan) -> Self {
+ Self { source: source.clone(), value }
+ }
+}
+
+impl<T> std::ops::Deref for Tracked<T> {
+ type Target = T;
+ fn deref(&self) -> &T {
+ &self.value
+ }
+}
+
+impl<T> std::ops::DerefMut for Tracked<T> {
+ fn deref_mut(&mut self) -> &mut T {
+ &mut self.value
+ }
+}
+
+impl<T: std::fmt::Display> std::fmt::Display for Tracked<T> {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
+ write!(f, "{}", self.value)
+ }
+}
+
+impl<T: std::fmt::Debug> std::fmt::Debug for Tracked<T> {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
+ write!(f, "{:?}", self.value)
+ }
+}
+
+impl<T: PartialEq> PartialEq for Tracked<T> {
+ fn eq(&self, other: &Tracked<T>) -> bool {
+ self.value.eq(&other.value)
+ }
+}
+
+impl<T: Eq> Eq for Tracked<T> {}