2023-06-16 12:58:06 -07:00
|
|
|
use crate::parser::Expression;
|
2023-06-14 14:36:58 -07:00
|
|
|
use std::collections::HashMap;
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct Context {
|
2023-06-16 12:58:06 -07:00
|
|
|
history: Vec<Expression>,
|
|
|
|
variables: HashMap<String, Expression>
|
2023-06-14 14:36:58 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Context {
|
|
|
|
pub fn new() -> Context {
|
|
|
|
Context{ history: Vec::new(), variables: HashMap::new() }
|
|
|
|
}
|
|
|
|
|
2023-06-16 12:58:06 -07:00
|
|
|
pub fn push_hist(&mut self, t: Expression) { self.history.push(t); }
|
2023-06-17 22:15:58 -07:00
|
|
|
pub fn push_var(&mut self, s: String, t: Expression) -> Result<(), ()> {
|
|
|
|
if self.valid_varible(&s) {
|
|
|
|
self.variables.insert(s, t);
|
|
|
|
return Ok(());
|
|
|
|
} else { return Err(()); }
|
|
|
|
}
|
2023-06-14 14:36:58 -07:00
|
|
|
|
2023-06-16 12:58:06 -07:00
|
|
|
pub fn get_variable(&self, s: &String) -> Option<Expression> {
|
|
|
|
let v: Option<&Expression>;
|
2023-06-14 14:36:58 -07:00
|
|
|
if s == "ans" {
|
|
|
|
v = self.history.last();
|
|
|
|
} else {
|
2023-06-14 16:15:51 -07:00
|
|
|
v = self.variables.get(s);
|
2023-06-14 14:36:58 -07:00
|
|
|
}
|
|
|
|
if v.is_some() { Some(v.unwrap().clone()) } else { None }
|
|
|
|
}
|
2023-06-17 22:15:58 -07:00
|
|
|
|
2023-08-02 17:37:29 -07:00
|
|
|
pub fn delete_variable(&mut self, s: &String) -> Result<(), ()> {
|
|
|
|
if !self.is_varible(s) { return Err(()) };
|
|
|
|
self.variables.remove(s);
|
|
|
|
return Ok(());
|
|
|
|
}
|
|
|
|
|
2023-06-17 22:15:58 -07:00
|
|
|
pub fn valid_varible(&self, s: &str) -> bool {
|
2023-08-03 14:28:22 -07:00
|
|
|
|
|
|
|
if {
|
|
|
|
Function::from_string(s).is_some() ||
|
|
|
|
Constant::from_string(s).is_some()
|
|
|
|
} { return false }
|
|
|
|
|
|
|
|
for c in s.to_lowercase().chars() {
|
|
|
|
if !"abcdefghijklmnopqrtstuvwxyz_".contains(c) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-06-17 22:15:58 -07:00
|
|
|
return match s {
|
|
|
|
"ans" => false,
|
|
|
|
_ => true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-02 17:37:29 -07:00
|
|
|
pub fn is_varible(&self, s: &str) -> bool {
|
|
|
|
return self.valid_varible(s) && self.variables.contains_key(s);
|
|
|
|
}
|
|
|
|
|
2023-08-02 15:36:55 -07:00
|
|
|
pub fn get_variables(&self) -> &HashMap<String, Expression> {
|
|
|
|
return &self.variables
|
|
|
|
}
|
|
|
|
|
2023-06-14 14:36:58 -07:00
|
|
|
}
|