min_timer 0.1.0

Simple f64 based duration and timer.
Documentation
# min_timer

---

This is a small library that provides `f64` based duration and timer. Standard
library's implementation uses integers. Thus, for a clock that gives time as
`f64`, this library should have higher performance. Additionally, there are less
checks. Although, there is strong type safety for SI units (seconds), which is
hopefully optimized away by the compiler.

---

## Example

```rust
use min_timer::{now::Std, Sec, Timer};

fn wait(dur: Sec) {
    let now = Std::new(); // Uses std::time implementation of min_timer::now::Now.
    let timer = Timer::new(&now);
    while timer < dur {} // A resource consuming software wait.
}

fn count(upto: u32) {
    let dur = Sec::MINUTE;
    let now = Std::new();
    let mut timer = Timer::new(&now);
    let mut count = 0;

    while count < upto {
        if timer >= dur {
            timer += dur; // Move the timer forwards.
            count += 1;
            println!("Counting {}...", count);
        }
    }
}
```

---

## Usage

```rust
// Type safety.
// Seconds can be only added and subtracted with other seconds.
// Can be scaled with scalars tho.
// 4s * 5s = 20 s^2 -> Result has a different dimension: T^2.
// 4s + 5 = ? -> Meaningless, adding numbers of different dimensions: T + 1.
let duration = Sec::new(0.01);
// Or...
let duration = 10.0 * Sec::MILLI;

// To and from standard library's duration.
let std_dur = std::time::Duration::from(duration);

// Provided implementation (using standard library).
// As written previously this has conversions to and from, doubles and integers.
// You should prefer directly using the standard library `timer` (std::time::Instant).
let now = min_timer::now::Std::new();

// Get the time.
// You won't be using this manually.
let start = now.now();
let elapsed = now.now() - start;

// Creating timer, holds a ref to `now`.
let timer = Timer::new(&now);
// Holds the start and gives you elapsed time.
let elapsed = timer.elapsed();

// Usefullness of timer:

// Moving forwards...
let timer = timer + Sec::new(8.0);
// Or...
let mut timer = Timer::new(&now);
timer += Sec::new(1.0);

// Checking elapsed time...
// Simply, `timer` is taken as `elapsed` for these calcualtions.
let passed = timer > duration;
let remaining = duration - timer;
let same = timer == duration;

// Do not thrust `same` that is above!
// These are floating point numbers!
// Use the one on the next line.
let tolerance = Sec::new(1e-3); // 1 us
```

---

## Motivation

Why write this when there is the standard library? First, education: I got to
practice **Rust**, espacially _newtype_ pattern with `Sec`. Second, I didn't now
much about `std::time` before writing this. Third, I will use this with **GLFW**
timer, which returns the time as a `double` in seconds. This way I will
implement `Now` with **GLFW** and there will be no conversions compared to:

```rust
fn time(glfw: &Glfw) -> Duration {
    Duration::from_sec_f64(glfw.get_time()) // conversion!
}

let start = time(&glfw);
let elapsed = time(&glfw) - start;
let seconds = elapsed.as_sec_f64(); // conversion!
```

Check out my other crate, **min_gl**, for seeing the `Now` implementation for
the **GLFW** timer.

---

Copyright (C) 2022 Cem GeƧgel <gecgelcem@outlook.com>