1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use serde::{Deserialize, Serialize};
use std::{fmt::Display, time::SystemTime};

pub mod level;

#[derive(Debug, Clone)]
pub enum Feedback {
    CorrectAnswer,
    WrongAnswer {
        correct_answers: Vec<String>,
        explanation: Option<String>,
    },
}

pub trait UserInteraction {
    fn get_string(&mut self, title: Option<impl Display>, prompt: impl Display) -> String;
    fn select_item(&mut self, title: Option<impl Display>, items: &[impl Display]) -> usize;
    fn select_multipe(
        &mut self,
        title: Option<impl Display>,
        items: &[impl Display],
    ) -> Box<[bool]>;
}

pub trait Task<'a>: Serialize + Deserialize<'a> {
    type SharedState: SharedState<'a>;

    fn get_desctiption(&self) -> &str;

    fn next_repetition(&self, _retrievability_goal: f64) -> SystemTime;
    fn complete(
        self,
        shared_state: &mut Self::SharedState,
        interaction: impl UserInteraction,
    ) -> (Self, Feedback);
}

pub trait SharedState<'a>: Default + Serialize + Deserialize<'a> {}
impl<'a> SharedState<'a> for () {}

pub trait SharedStateExt<'a>: SharedState<'a> {
    fn optimize(&mut self);
}