use std::time::Instant;
use crate::timing::Duration;
pub trait AnimationClock {
fn now(&self) -> Duration;
}
#[derive(Debug, Clone)]
pub struct SystemClock {
started_at: Instant,
}
impl SystemClock {
#[must_use]
pub fn new() -> Self {
Self {
started_at: Instant::now(),
}
}
}
impl Default for SystemClock {
fn default() -> Self {
Self::new()
}
}
impl AnimationClock for SystemClock {
fn now(&self) -> Duration {
self.started_at.elapsed().into()
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct TestClock {
now: Duration,
}
impl TestClock {
#[must_use]
pub const fn new() -> Self {
Self {
now: Duration::ZERO,
}
}
#[must_use]
pub fn at(now: impl Into<Duration>) -> Self {
Self { now: now.into() }
}
pub fn set_now(&mut self, now: impl Into<Duration>) {
self.now = now.into();
}
pub fn advance_by(&mut self, duration: impl Into<Duration>) {
self.now += duration.into();
}
}
impl Default for TestClock {
fn default() -> Self {
Self::new()
}
}
impl AnimationClock for TestClock {
fn now(&self) -> Duration {
self.now
}
}