use crate::{graph::Graph, parser::TermParser};
mod problem_parser;
use operation::Operation;
use self::problem_parser::transform_raw_to_numbers;
mod operation;
#[derive(Debug, Clone)]
pub struct Problem(pub Vec<(TermParser, Option<Operation>)>);
impl Problem {
pub fn solve(self, unknown: Option<f64>) -> f64 {
let parsed_input = &self.0;
let first_value = parsed_input.first().expect("No first value"); let mut initial_value = first_value.0.clone().solve(unknown);
self.0
.as_slice()
.iter()
.enumerate()
.filter(|index: &(usize, &(TermParser, Option<Operation>))| index.0 != 0)
.for_each(|(index, (value, _))| {
let operation = self.0[index - 1].1;
initial_value = match operation {
Some(operation) => operation.apply(initial_value, value.clone().solve(unknown)),
None => panic!("No operation"),
};
});
initial_value
}
pub fn write_with_diagram(&self, start: i64, end: i64) {
let mut graph = Graph::new(start, end, self);
graph.set_origo();
graph.write();
graph.average();
graph.median();
graph.graph();
}
}
impl From<&str> for Problem {
fn from(raw_input: &str) -> Self {
let str_vec = raw_input.split("").collect::<Vec<&str>>()[1..].to_vec();
Self(transform_raw_to_numbers(&str_vec))
}
}