use std::time::{Duration, Instant};
use crate::scheduler::engine::Tag;
use crate::scheduler::step::Steps;
mod builder;
mod convert;
pub use builder::Builder;
pub use convert::{IntoDuration, IntoInstant};
#[derive(Debug)]
pub enum Timer<I, C = ()> {
Set {
deadline: Instant,
data: Option<Steps<I, C>>,
},
Reset {
deadline: Instant,
data: Option<Steps<I, C>>,
},
Repeat {
interval: Duration,
data: Option<Steps<I, C>>,
},
Clear,
}
impl<I, C> Timer<I, C> {
#[inline]
#[must_use]
pub fn set<T>(deadline: T, data: Option<Steps<I, C>>) -> Self
where
T: IntoInstant,
{
Timer::Set {
deadline: deadline.into_instant(),
data,
}
}
#[inline]
#[must_use]
pub fn reset<T>(deadline: T, data: Option<Steps<I, C>>) -> Self
where
T: IntoInstant,
{
Timer::Reset {
deadline: deadline.into_instant(),
data,
}
}
#[inline]
#[must_use]
pub fn repeat<T>(interval: T, data: Option<Steps<I, C>>) -> Self
where
T: IntoDuration,
{
Timer::Repeat {
interval: interval.into_duration(),
data,
}
}
#[inline]
#[must_use]
pub fn clear() -> Self {
Timer::Clear
}
}
#[allow(clippy::must_use_candidate)]
impl<I, C> Timer<I, C> {
#[inline]
pub fn data(&self) -> Option<&Steps<I, C>> {
match self {
Timer::Set { data, .. } => data.as_ref(),
Timer::Reset { data, .. } => data.as_ref(),
Timer::Repeat { data, .. } => data.as_ref(),
Timer::Clear => None,
}
}
}
impl<I, C> Tag<I, C> for Timer<I, C> {
type Target<T> = Timer<I, T>;
#[inline]
fn tag<T>(self) -> Self::Target<T> {
match self {
Timer::Set { deadline, data } => {
let data = data.map(Steps::tag);
Timer::Set { deadline, data }
}
Timer::Reset { deadline, data } => {
let data = data.map(Steps::tag);
Timer::Reset { deadline, data }
}
Timer::Repeat { interval, data } => {
let data = data.map(Steps::tag);
Timer::Repeat { interval, data }
}
Timer::Clear => Timer::Clear,
}
}
}
impl<I, C> PartialEq for Timer<I, C> {
#[inline]
fn eq(&self, _: &Self) -> bool {
false
}
}
impl<I, C> Eq for Timer<I, C> {}