From 56ccc4b58b8e7540ad05cf6c537ebff5cd142e74 Mon Sep 17 00:00:00 2001
From: Quaternions <krakow20@gmail.com>
Date: Wed, 31 Jul 2024 13:16:16 -0700
Subject: [PATCH] wip: run

---
 src/lib.rs |  1 +
 src/run.rs | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)
 create mode 100644 src/run.rs

diff --git a/src/lib.rs b/src/lib.rs
index 36a0933..b202c97 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,5 +1,6 @@
 pub mod bvh;
 pub mod map;
+pub mod run;
 pub mod aabb;
 pub mod model;
 pub mod zeroes;
diff --git a/src/run.rs b/src/run.rs
new file mode 100644
index 0000000..7d0a187
--- /dev/null
+++ b/src/run.rs
@@ -0,0 +1,67 @@
+use crate::timer::{Timer,Scaled,Error as TimerError};
+use crate::integer::Time;
+
+pub enum InvalidationReason{
+
+}
+
+#[derive(Debug)]
+pub enum Error{
+	Timer(TimerError),
+	AlreadyStarted,
+	NotStarted,
+	AlreadyFinished,
+}
+impl std::fmt::Display for Error{
+	fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
+		write!(f,"{self:?}")
+	}
+}
+impl std::error::Error for Error{}
+
+pub struct Run{
+	timer:Timer<Scaled>,
+	invalidated:Option<InvalidationReason>,
+	created:Time,
+	started:Option<Time>,
+	finished:Option<Time>,
+}
+
+impl Run{
+	pub fn new(created:Time)->Self{
+		Self{
+			timer:Timer::scaled_paused(
+				created,
+				Time::ZERO,
+				crate::integer::Ratio64::ONE,
+			),
+			invalidated:None,
+			created,
+			started:None,
+			finished:None,
+		}
+	}
+	pub fn start(&mut self,time:Time)->Result<(),Error>{
+		match self.started{
+			Some(_)=>Err(Error::AlreadyStarted),
+			None=>{
+				self.started=Some(time);
+				self.timer.unpause(time).map_err(Error::Timer)?;
+				Ok(())
+			}
+		}
+	}
+	pub fn finish(&mut self,time:Time)->Result<(),Error>{
+		if self.started.is_none(){
+			return Err(Error::NotStarted);
+		}
+		match self.finished{
+			Some(_)=>Err(Error::AlreadyFinished),
+			None=>{
+				self.finished=Some(time);
+				self.timer.pause(time).map_err(Error::Timer)?;
+				Ok(())
+			}
+		}
+	}
+}