summary refs log tree commit diff
path: root/src/util/tracker.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/tracker.rs')
-rw-r--r--src/util/tracker.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/util/tracker.rs b/src/util/tracker.rs
new file mode 100644
index 0000000..66c30a9
--- /dev/null
+++ b/src/util/tracker.rs
@@ -0,0 +1,41 @@
+pub struct Tracker<T> {
+    inner: T,
+    dirty: bool,
+}
+
+/// Tracks changes to an inner value T. Any change using `set` will cause the
+/// tracker to be marked as dirty.
+impl<T> Tracker<T> {
+    pub fn new(inner: T) -> Self {
+        Self { inner, dirty: true }
+    }
+
+    pub fn get(&self) -> &T {
+        &self.inner
+    }
+
+    pub fn get_mut(&mut self) -> &mut T {
+        self.dirty = true;
+        &mut self.inner
+    }
+
+    pub fn set(&mut self, value: T) {
+        self.dirty = true;
+        self.inner = value;
+    }
+
+    pub fn is_dirty(&self) -> bool {
+        self.dirty
+    }
+
+    /// Marks the tracker as clean.
+    pub fn reset(&mut self) {
+        self.dirty = false;
+    }
+}
+
+impl<T: Default> Default for Tracker<T> {
+    fn default() -> Self {
+        Self::new(T::default())
+    }
+}