intermediate refactor

This commit is contained in:
2023-09-07 16:25:15 -04:00
parent 739df0f990
commit 61f21c32db

View File

@@ -29,6 +29,9 @@ fn main() {
"/" => Function::Divide, "/" => Function::Divide,
"%" => Function::Modulo, "%" => Function::Modulo,
"clear" | "c" => Function::ClearStack, "clear" | "c" => Function::ClearStack,
"floor" | "fl" => Function::Floor,
"ceil" | "cl" => Function::Ceil,
"round" | "r" => Function::Round,
_ => Function::Push(f64::from_str(input.trim())), _ => Function::Push(f64::from_str(input.trim())),
}; };
@@ -47,12 +50,35 @@ fn main() {
} }
} }
#[derive(Debug)]
enum Function { enum Function {
Add, Add,
Subtract, Subtract,
Multiply, Multiply,
Divide, Divide,
Modulo, Modulo,
Floor,
Ceil,
Round,
Abs,
Pow,
Sqrt,
Cbrt,
LogN,
Log,
Sin,
Asin,
Sinh,
Acos,
Cos,
Cosh,
Tan,
Atan,
Tanh,
Epsilon,
Euler,
Pi,
Tau,
Push(Result<f64, ParseFloatError>), Push(Result<f64, ParseFloatError>),
ClearStack, ClearStack,
Quit, Quit,
@@ -65,19 +91,47 @@ fn stack_push(stack: &mut Vec<f64>, num: Result<f64, ParseFloatError>) {
} }
} }
fn idk_man(func: Function) {
println!("I don't know how to do {func:?}!")
}
fn small_stack_err(count_expected: i32, func: &str) {
println!("Stack must contain at least {count_expected} numbers to {func}!");
}
fn stack_way_too_small_err(func: &str) {
small_stack_err(1, func)
}
fn stack_too_small_err(func: &str) { fn stack_too_small_err(func: &str) {
println!("Stack must contain at least 2 numbers to {func}!"); small_stack_err(2, func);
}
fn operate_single(stack: &mut Vec<f64>, func: Function) {
if stack.len() < 1 {
stack_way_too_small_err("anything!!");
return;
}
let x = stack.pop().unwrap_or(0f64);
match func {
Function::Round => stack.push(x.round()),
others => idk_man(others),
}
} }
fn operate(stack: &mut Vec<f64>, func: Function) { fn operate(stack: &mut Vec<f64>, func: Function) {
if stack.len() < 2 { if stack.len() <= 1 {
match func { match func {
Function::Add => stack_too_small_err("add"), Function::Add => stack_too_small_err("add"),
Function::Subtract => stack_too_small_err("subtract"), Function::Subtract => stack_too_small_err("subtract"),
Function::Multiply => stack_too_small_err("multiply"), Function::Multiply => stack_too_small_err("multiply"),
Function::Divide => stack_too_small_err("divide"), Function::Divide => stack_too_small_err("divide"),
Function::Modulo => stack_too_small_err("modulo"), Function::Modulo => stack_too_small_err("modulo"),
_ => {} Function::Floor => stack_too_small_err("floor"),
Function::Ceil => stack_too_small_err("ceil"),
_ => {} //only above functions require
} }
return; return;
} }
@@ -93,8 +147,26 @@ fn operate(stack: &mut Vec<f64>, func: Function) {
//dependent. We're dividing the number input prior //dependent. We're dividing the number input prior
//to x (y), by x. i.e. x: 3, y: 6, push = 0.5 //to x (y), by x. i.e. x: 3, y: 6, push = 0.5
Function::Multiply => stack.push(x * y), Function::Multiply => stack.push(x * y),
Function::Modulo => stack.push(y % x),
//same reason as division above //same reason as division above
_ => {} //do nothing, as we don't know what to do with it Function::Modulo => stack.push(y % x),
Function::Floor => stack.push(floor(x, y)),
Function::Ceil => stack.push(ceil(x, y)),
others => idk_man(others),
}
}
fn floor(a: f64, b: f64) -> f64 {
if a > b {
a
} else {
b
}
}
fn ceil(a: f64, b: f64) -> f64 {
if a < b {
a
} else {
b
} }
} }