diff options
Diffstat (limited to 'src/input.rs')
| -rw-r--r-- | src/input.rs | 46 |
1 files changed, 15 insertions, 31 deletions
diff --git a/src/input.rs b/src/input.rs index 1dde8d5..ac5c5c8 100644 --- a/src/input.rs +++ b/src/input.rs @@ -1,6 +1,6 @@ use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; -use crate::{Calculator, Operator, Signal}; +use crate::{Calculator, Function, Operator, Signal}; impl Calculator { pub fn handle_input(&mut self, key: KeyEvent) -> Signal { @@ -27,7 +27,16 @@ impl Calculator { self.input_buffer = String::new(); } KeyCode::Char(c) => self.push_to_buffer(c), - KeyCode::Enter => self.push_buffer_to_stack(), + KeyCode::Enter if self.input_buffer.len() > 0 => { + if let Ok(func) = Function::parse(&self.input_buffer) { + if let Some(f) = self.stack.pop() { + self.stack.push(func.func()(f)); + } + } else { + self.stack.push(self.input_buffer.parse::<f64>().unwrap()); + } + self.input_buffer = String::new(); + } KeyCode::Backspace => { self.input_buffer.pop(); } @@ -45,42 +54,17 @@ impl Calculator { } self.input_buffer.push(c); } else if let Ok(op) = Operator::parse(c) { - self.push_buffer_to_stack(); - self.perform_operation(op); + self.stack.push(self.input_buffer.parse::<f64>().unwrap()); + self.input_buffer = String::new(); + self.op(op); } else { self.input_buffer.push(c); } } - fn push_buffer_to_stack(&mut self) { - match self.input_buffer.as_str() { - "sin" => { - if let Some(f) = self.stack.last_mut() { - *f = f.sin(); - } - } - "cos" => { - if let Some(f) = self.stack.last_mut() { - *f = f.cos(); - } - } - "tan" => { - if let Some(f) = self.stack.last_mut() { - *f = f.tan(); - } - } - _ => { - if self.input_buffer.len() > 0 { - self.stack.push(self.input_buffer.parse::<f64>().unwrap()); - } - } - } - self.input_buffer = String::new(); - } - fn swap(&mut self) { if let Some(f) = self.stack.pop() { - self.push_buffer_to_stack(); + self.stack.push(self.input_buffer.parse::<f64>().unwrap()); self.input_buffer = format!("{}", f); } } |