fitts 0.2.1

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

use fitts::{CardState, FittsScheduler, Rating};

fn main() {
    let mut scheduler = FittsScheduler::new();
    let mut card = CardState::default();

    println!("SM-2 Interval Progression\n");
    println!("Rating: Good (quality=4)\n");
    println!("{:>8} {:>10} {:>8}", "Review", "Interval", "Ease");
    println!("{:-<30}", "");

    for i in 1..=10 {
        let result = scheduler.review(card, Rating::Good);
        card = result.card;
        println!(
            "{:>8} {:>9.0}d {:>8.2}",
            i, card.interval_days, card.ease_factor
        );
    }

    println!("\n\nRating: Easy (quality=5)\n");
    println!("{:>8} {:>10} {:>8}", "Review", "Interval", "Ease");
    println!("{:-<30}", "");

    let mut card = CardState::default();
    for i in 1..=10 {
        let result = scheduler.review(card, Rating::Easy);
        card = result.card;
        println!(
            "{:>8} {:>9.0}d {:>8.2}",
            i, card.interval_days, card.ease_factor
        );
    }

    println!("\n\nLapse recovery (Again rating)\n");
    println!(
        "{:>8} {:>10} {:>8} {:>8}",
        "Review", "Interval", "Ease", "Lapses"
    );
    println!("{:-<40}", "");

    let mut card = CardState {
        interval_days: 30.0,
        ease_factor: 2.5,
        repetitions: 5,
        ..Default::default()
    };
    println!(
        "{:>8} {:>9.0}d {:>8.2} {:>8}",
        "before", card.interval_days, card.ease_factor, card.lapses
    );

    for i in 1..=5 {
        let rating = if i <= 2 { Rating::Again } else { Rating::Good };
        let result = scheduler.review(card, rating);
        card = result.card;
        println!(
            "{:>8} {:>9.0}d {:>8.2} {:>8}",
            i, card.interval_days, card.ease_factor, card.lapses
        );
    }
}