fitts 0.2.1

Spaced repetition scheduler using Fitts' Law for difficulty prediction and SM-2 for interval scheduling.
Documentation
//! Fitts' Law model demonstration.

use fitts::FittsModel;

fn main() {
    let model = FittsModel::new(0.5, 0.3);

    println!("Fitts' Law Memory Model");
    println!("RT = a + b × log₂(distance / accessibility + 1)\n");

    println!("Response Time by Interval and Ease:\n");
    println!(
        "{:>10} {:>8} {:>8} {:>8}",
        "Interval", "Low EF", "Mid EF", "High EF"
    );
    println!("{:-<40}", "");

    for interval in [1.0, 7.0, 14.0, 30.0, 60.0, 90.0] {
        let low = model.response_time(interval, 1.5, interval);
        let mid = model.response_time(interval, 2.0, interval);
        let high = model.response_time(interval, 2.5, interval);
        println!(
            "{:>9.0}d {:>7.2}s {:>7.2}s {:>7.2}s",
            interval, low, mid, high
        );
    }

    println!("\n\nRetrievability by Interval:\n");
    println!("{:>10} {:>12} {:>12}", "Interval", "Ease 1.5", "Ease 2.5");
    println!("{:-<40}", "");

    for interval in [1.0, 7.0, 14.0, 30.0, 60.0, 90.0, 180.0, 365.0] {
        let r_low = model.retrievability(interval, 1.5, interval);
        let r_high = model.retrievability(interval, 2.5, interval);
        println!(
            "{:>9.0}d {:>11.1}% {:>11.1}%",
            interval,
            r_low * 100.0,
            r_high * 100.0
        );
    }

    println!("\n\nDifficulty Classification (4 levels):\n");
    println!("  Easy:     RT < 4s    → expects Rating::Easy");
    println!("  Medium:   RT 4-10s   → expects Rating::Good");
    println!("  Hard:     RT 10-20s  → expects Rating::Hard");
    println!("  VeryHard: RT ≥ 20s   → expects Rating::Again");
}