#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Progress {
Forward(f32),
Reverse(f32),
}
impl Default for Progress {
fn default() -> Self {
Self::Forward(1.0)
}
}
impl Progress {
pub fn value(&self) -> f32 {
match self {
Self::Forward(progress) => *progress,
Self::Reverse(progress) => 1.0 - *progress,
}
}
pub fn progress(&self) -> f32 {
match self {
Self::Forward(progress) => *progress,
Self::Reverse(progress) => *progress,
}
}
pub fn reverse(&mut self) {
*self = self.reversed();
}
pub fn reversed(&self) -> Self {
match self {
Self::Forward(progress) => Self::Reverse(1.0 - progress),
Self::Reverse(progress) => Self::Forward(1.0 - progress),
}
}
pub fn is_complete(&self) -> bool {
self.progress() >= 1.0
}
pub fn update(&mut self, delta_progress: f32) {
let progress = (self.progress() + delta_progress).clamp(0.0, 1.0);
match self {
Self::Forward(p) | Self::Reverse(p) => *p = progress,
}
}
pub fn settle(&mut self) {
match self {
Self::Forward(progress) => *progress = 1.0,
Self::Reverse(progress) => *progress = 1.0,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn reversed() {
let progress = Progress::Forward(0.2);
let reversed = progress.reversed();
assert_eq!(reversed, Progress::Reverse(0.8));
}
#[test]
fn forward_value() {
let progress = Progress::Forward(0.25);
assert_eq!(progress.value(), 0.25);
}
#[test]
fn reverse_value() {
let progress = Progress::Reverse(0.25);
assert_eq!(progress.value(), 0.75);
}
#[test]
fn settle() {
let mut progress = Progress::Forward(0.5);
progress.settle();
assert_eq!(progress, Progress::Forward(1.0));
}
#[test]
fn settle_reverse() {
let mut progress = Progress::Reverse(0.5);
progress.settle();
assert_eq!(progress, Progress::Reverse(1.0));
}
#[test]
fn is_complete() {
let progress = Progress::Forward(0.5);
assert!(!progress.is_complete());
let progress = Progress::Forward(1.0);
assert!(progress.is_complete());
let progress = Progress::Reverse(1.0);
assert!(progress.is_complete());
}
#[test]
fn update() {
let mut progress = Progress::Forward(0.0);
progress.update(0.5);
assert_eq!(progress.value(), 0.5);
progress.update(0.5);
assert_eq!(progress.value(), 1.0);
progress.update(0.5);
assert_eq!(progress.value(), 1.0);
}
#[test]
fn default() {
assert_eq!(Progress::default(), Progress::Forward(1.0));
}
}