use std::time::Duration;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RepeatCount {
Finite(u32),
For(Duration),
Infinite,
}
impl Default for RepeatCount {
#[inline]
fn default() -> Self {
Self::Finite(1)
}
}
impl From<u32> for RepeatCount {
#[inline]
fn from(count: u32) -> Self {
Self::Finite(count)
}
}
impl From<Duration> for RepeatCount {
#[inline]
fn from(duration: Duration) -> Self {
Self::For(duration)
}
}
impl RepeatCount {
#[inline]
pub fn total_duration(&self, cycle_duration: Duration) -> Option<Duration> {
match self {
RepeatCount::Finite(count) => Some(cycle_duration * *count),
RepeatCount::For(dur) => Some(*dur),
RepeatCount::Infinite => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum RepeatStrategy {
#[default]
Repeat,
MirroredRepeat,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_repeat_count_total_duration() {
let cycle = Duration::from_secs(2);
assert_eq!(
RepeatCount::Finite(3).total_duration(cycle),
Some(Duration::from_secs(6))
);
assert_eq!(
RepeatCount::For(Duration::from_secs(5)).total_duration(cycle),
Some(Duration::from_secs(5))
);
assert_eq!(RepeatCount::Infinite.total_duration(cycle), None);
}
#[test]
fn test_repeat_conversions() {
assert_eq!(RepeatCount::from(5u32), RepeatCount::Finite(5));
assert_eq!(
RepeatCount::from(Duration::from_millis(500)),
RepeatCount::For(Duration::from_millis(500))
);
}
}