use serde::{Deserialize, Serialize};
use std::time::SystemTime;
pub mod level;
#[derive(Debug, Clone)]
pub enum Feedback {
CorrectAnswer,
WrongAnswer {
correct_answers: Vec<String>,
explanation: Option<String>,
},
}
pub enum InterationItem {
Text(String),
BlankField,
OneOf(Vec<(u32, String)>),
AnyOf(Vec<(u32, String)>),
Order(Vec<(u32, String)>),
}
pub trait UserInteraction {
fn interact(&mut self, items: Vec<InterationItem>) -> Vec<String>;
}
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: &mut 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);
}