use std::time::{Duration, Instant};
pub trait Delayed {
fn delayed_until(&self) -> Instant;
}
#[derive(Debug, PartialEq, Eq)]
pub struct Delay<T> {
pub value: T,
until: Instant,
}
impl<T> Delay<T> {
pub fn until_instant(value: T, until: Instant) -> Delay<T> {
Delay { value, until }
}
pub fn for_duration(value: T, duration: Duration) -> Delay<T> {
Delay::until_instant(value, Instant::now() + duration)
}
}
impl<T> Delayed for Delay<T> {
fn delayed_until(&self) -> Instant {
self.until
}
}
impl<T: Default> Default for Delay<T> {
fn default() -> Delay<T> {
Delay {
value: Default::default(),
until: Instant::now(),
}
}
}
#[cfg(test)]
mod tests {
use std::time::{Duration, Instant};
use super::{Delay, Delayed};
#[test]
fn compare_until() {
let delayed_one_hour = Delay::for_duration(123, Duration::from_secs(3600));
let delayed_now = Delay::until_instant("abc", Instant::now());
assert!(delayed_one_hour.delayed_until() > delayed_now.delayed_until());
}
#[test]
fn correct_value() {
let delayed_one_hour = Delay::for_duration(123, Duration::from_secs(3600));
let delayed_now = Delay::until_instant("abc", Instant::now());
assert_eq!(delayed_one_hour.value, 123);
assert_eq!(delayed_now.value, "abc");
}
}