use rand::{thread_rng, Rng};
use crate::generator::generate;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Operation {
Increment,
Decrement,
}
impl Operation {
pub fn opposite(&self) -> Operation {
match self {
Operation::Increment => Operation::Decrement,
Operation::Decrement => Operation::Increment,
}
}
pub fn get_random() -> Operation {
let mut rng = thread_rng();
if rng.gen_bool(0.5) {
Operation::Increment
} else {
Operation::Decrement
}
}
}
#[derive(Debug, Clone, Copy)]
pub enum GenerateFormula {
NF,
LF,
BF,
FF,
}
#[derive(Debug)]
pub struct GenerateOptions {
pub formula: GenerateFormula,
pub min: i64,
pub max: i64,
pub len: usize,
}
impl GenerateOptions {
#[allow(dead_code)]
pub fn with_formula(&mut self, formula: GenerateFormula) {
self.formula = formula;
}
pub fn generate(&self) -> Vec<i64> {
generate(&self)
}
}
pub type Rule = Vec<u8>;
#[derive(Debug, Clone)]
pub struct GenerateRule {
pub zero: Rule,
pub one: Rule,
pub two: Rule,
pub three: Rule,
pub four: Rule,
pub five: Rule,
pub six: Rule,
pub seven: Rule,
pub eight: Rule,
pub nine: Rule,
}
#[derive(Debug)]
pub struct GenerateRules {
pub increment: GenerateRule,
pub decrement: GenerateRule,
}
pub struct TermOptions {
pub cur_num: Vec<i64>,
pub formula: GenerateFormula,
pub terms_len: i64,
pub schema: TermSchema,
pub max: i64,
pub min: i64,
pub previos_term: Option<i64>,
}
#[derive(Debug, Clone)]
pub struct FactorOptions {
pub number: u8,
pub formula: GenerateFormula,
pub schema: TermSchema,
pub forbidden_number: Option<u8>,
}
pub struct SchemaOptions {
pub terms_len: usize,
}
#[derive(Debug, Clone, Copy)]
pub struct TermSchema {
pub can_generate_zero: bool,
pub force_formula: bool,
pub operation: Option<Operation>,
}