use std::sync::OnceLock;
use crate::time::{LocalTime, Time, TimelineTime};
use crate::window::Window;
use super::*;
#[derive(Debug, Clone, Copy)]
pub struct Clock<'a> {
global: TimelineTime,
local: LocalTime,
triggers: &'a TriggerTable,
window: Option<f64>,
}
impl<'a> Clock<'a> {
pub fn new(global: TimelineTime, local: LocalTime, triggers: &'a TriggerTable) -> Self {
Self {
global,
local,
triggers,
window: None,
}
}
pub fn structural() -> Clock<'static> {
static EMPTY: OnceLock<TriggerTable> = OnceLock::new();
let triggers = EMPTY.get_or_init(TriggerTable::new);
Clock {
global: TimelineTime::new(0.0),
local: LocalTime::new(0.0),
triggers,
window: None,
}
}
pub fn local(&self) -> LocalTime {
self.local
}
pub fn with_local(&self, local: LocalTime) -> Clock<'a> {
Clock {
global: self.global,
local,
triggers: self.triggers,
window: self.window,
}
}
pub fn with_local_window(&self, local: LocalTime, window: Option<f64>) -> Clock<'a> {
Clock {
global: self.global,
local,
triggers: self.triggers,
window,
}
}
pub fn global(&self) -> TimelineTime {
self.global
}
pub fn shifted(&self, dt: f64) -> Clock<'a> {
Clock {
global: TimelineTime::new(self.global.seconds() + dt),
local: LocalTime::new(self.local.seconds() + dt),
triggers: self.triggers,
window: self.window,
}
}
pub fn window(&self) -> Option<Window> {
self.window
.map(|len| Window::new(0.0, len, self.local.seconds()))
}
pub(crate) fn trigger_of(&self, e: Event) -> TimelineTime {
self.triggers.get(e.id())
}
}