perhaps this?

```rust
struct OverflowError;

trait Duration: Copy + Eq + PartialEq + Hash + Add + Sub + Mul<u32> + Div<u32> {
    fn from_secs(secs: u32) -> Result<Self, OverflowError>;
    fn from_millis(millis: u32) -> Result<Self, OverflowError>;
    fn from_micros(micros: u32) -> Result<Self, OverflowError>;
    fn as_secs(self) -> Result<u32, OverflowError>;
    fn as_millis(self) -> Result<u32, OverflowError>;
    fn as_micros(self) -> Result<u32, OverflowError>;
}

trait CountDown {
    type Duration: Duration;
    fn start(&mut self, dur: Duration);
    fn is_done(&mut self) -> bool;
}

trait CountUp {
    type Duration: Duration;
    fn start(&mut self);
    fn read(&mut self) -> Result<Duration, OverflowError>;
}