use std::sync::Arc;
use crate::command::handle_param_setters;
use super::{ClockId, ClockShared, ClockSpeed, ClockTime, CommandWriters};
#[derive(Debug)]
pub struct ClockHandle {
pub(crate) id: ClockId,
pub(crate) shared: Arc<ClockShared>,
pub(crate) command_writers: CommandWriters,
}
impl ClockHandle {
#[must_use]
pub fn id(&self) -> ClockId {
self.id
}
#[must_use]
pub fn ticking(&self) -> bool {
self.shared.ticking()
}
#[must_use]
pub fn time(&self) -> ClockTime {
ClockTime {
clock: self.id,
ticks: self.shared.ticks(),
fraction: self.shared.fractional_position(),
}
}
handle_param_setters! {
speed: ClockSpeed,
}
pub fn start(&mut self) {
self.command_writers.set_ticking.write(true)
}
pub fn pause(&mut self) {
self.command_writers.set_ticking.write(false)
}
pub fn stop(&mut self) {
self.command_writers.set_ticking.write(false);
self.command_writers.reset.write(());
}
}
impl Drop for ClockHandle {
fn drop(&mut self) {
self.shared.mark_for_removal();
}
}
impl From<&ClockHandle> for ClockId {
fn from(handle: &ClockHandle) -> Self {
handle.id()
}
}