Added functions to context

pull/2/head
Mark 2023-08-04 12:25:10 -07:00
parent 9a391480b9
commit d452f76455
Signed by: Mark
GPG Key ID: AD62BB059C2AAEE4
1 changed files with 53 additions and 11 deletions

View File

@ -1,20 +1,42 @@
use crate::parser::Expression; use crate::parser::{Expression, Function, Constant};
use crate::quantity::freeunit_from_string;
use std::collections::HashMap; use std::collections::HashMap;
#[derive(Debug)] #[derive(Debug)]
pub struct Context { pub struct Context {
history: Vec<Expression>, history: Vec<Expression>,
variables: HashMap<String, Expression> variables: HashMap<String, Expression>,
functions: HashMap<String, (Vec<String>, Expression)>
} }
// General functions
impl Context { impl Context {
pub fn new() -> Context { pub fn new() -> Context {
Context{ history: Vec::new(), variables: HashMap::new() } Context{
history: Vec::new(),
variables: HashMap::new(),
functions: HashMap::new(),
}
} }
pub fn push_hist(&mut self, t: Expression) { self.history.push(t); } pub fn push_hist(&mut self, t: Expression) { self.history.push(t); }
pub fn push_var(&mut self, s: String, t: Expression) -> Result<(), ()> {
pub fn delete(&mut self, s: &String) -> Result<(), ()> {
if !(self.is_varible(s) || self.is_function(s)) { return Err(()) };
if self.is_varible(s) { self.variables.remove(s); }
if self.is_function(s) { self.functions.remove(s); }
return Ok(());
}
}
// Variable manipulation
impl Context {
pub fn push_variable(&mut self, s: String, t: Expression) -> Result<(), ()> {
if self.valid_varible(&s) { if self.valid_varible(&s) {
self.functions.remove(&s);
self.variables.insert(s, t); self.variables.insert(s, t);
return Ok(()); return Ok(());
} else { return Err(()); } } else { return Err(()); }
@ -30,14 +52,7 @@ impl Context {
if v.is_some() { Some(v.unwrap().clone()) } else { None } if v.is_some() { Some(v.unwrap().clone()) } else { None }
} }
pub fn delete_variable(&mut self, s: &String) -> Result<(), ()> {
if !self.is_varible(s) { return Err(()) };
self.variables.remove(s);
return Ok(());
}
pub fn valid_varible(&self, s: &str) -> bool { pub fn valid_varible(&self, s: &str) -> bool {
if { if {
Function::from_string(s).is_some() || Function::from_string(s).is_some() ||
Constant::from_string(s).is_some() || Constant::from_string(s).is_some() ||
@ -65,3 +80,30 @@ impl Context {
} }
} }
// Function manipulation
impl Context {
pub fn valid_function(&self, s: &str) -> bool {
return self.valid_varible(s);
}
pub fn push_function(&mut self, s: String, a: Vec<String>, t: Expression) -> Result<(), ()> {
if self.valid_function(&s) {
self.variables.remove(&s);
self.functions.insert(s, (a, t));
return Ok(());
} else { return Err(()); }
}
pub fn get_function(&self, s: &String) -> Option<(Vec<String>, Expression)> {
return Some(self.functions.get(s).unwrap().clone());
}
pub fn is_function(&self, s: &str) -> bool {
return self.valid_function(s) && self.functions.contains_key(s);
}
pub fn get_functions(&self) -> &HashMap<String, (Vec<String>, Expression)> {
return &self.functions
}
}