lazy_static for add_asterisks

This commit is contained in:
Simon Gardling 2022-03-08 10:32:00 -05:00
parent 1f326b1766
commit 5d4c2838a0

View File

@ -29,6 +29,14 @@ impl BackingFunction {
pub fn derivative(&self, x: f64) -> f64 { self.derivative_1.eval(&[x]).unwrap_or(f64::NAN) } pub fn derivative(&self, x: f64) -> f64 { self.derivative_1.eval(&[x]).unwrap_or(f64::NAN) }
} }
lazy_static::lazy_static! {
static ref VALID_VARIABLES: Vec<char> = "xeπ".chars().collect();
static ref LETTERS: Vec<char> = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
.chars()
.collect();
static ref NUMBERS: Vec<char> = "0123456789".chars().collect();
}
/* /*
EXTREMELY Janky function that tries to put asterisks in the proper places to be parsed. This is so cursed. But it works, and I hopefully won't ever have to touch it again. EXTREMELY Janky function that tries to put asterisks in the proper places to be parsed. This is so cursed. But it works, and I hopefully won't ever have to touch it again.
One limitation though, variables with multiple characters like `pi` cannot be multiplied (like `pipipipi` won't result in `pi*pi*pi*pi`). But that's such a niche use case (and that same thing could be done by using exponents) that it doesn't really matter. One limitation though, variables with multiple characters like `pi` cannot be multiplied (like `pipipipi` won't result in `pi*pi*pi*pi`). But that's such a niche use case (and that same thing could be done by using exponents) that it doesn't really matter.
@ -36,11 +44,6 @@ In the future I may want to completely rewrite this or implement this natively i
*/ */
pub fn add_asterisks(function_in: String) -> String { pub fn add_asterisks(function_in: String) -> String {
let function = function_in.replace("log10(", "log(").replace("pi", "π"); // pi -> π and log10 -> log let function = function_in.replace("log10(", "log(").replace("pi", "π"); // pi -> π and log10 -> log
let valid_variables: Vec<char> = "xeπ".chars().collect();
let letters: Vec<char> = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
.chars()
.collect();
let numbers: Vec<char> = "0123456789".chars().collect();
let function_chars: Vec<char> = function.chars().collect(); let function_chars: Vec<char> = function.chars().collect();
let mut output_string: String = String::new(); let mut output_string: String = String::new();
let mut prev_chars: Vec<char> = Vec::new(); let mut prev_chars: Vec<char> = Vec::new();
@ -60,32 +63,32 @@ pub fn add_asterisks(function_in: String) -> String {
' ' ' '
}; };
let c_letters_var = letters.contains(&c) | valid_variables.contains(&c); let c_letters_var = LETTERS.contains(&c) | VALID_VARIABLES.contains(&c);
let prev_letters_var = valid_variables.contains(&prev_char) | letters.contains(&prev_char); let prev_letters_var = VALID_VARIABLES.contains(&prev_char) | LETTERS.contains(&prev_char);
if prev_char == ')' { if prev_char == ')' {
if (c == '(') | numbers.contains(&c) | c_letters_var { if (c == '(') | NUMBERS.contains(&c) | c_letters_var {
add_asterisk = true; add_asterisk = true;
} }
} else if c == '(' { } else if c == '(' {
if (valid_variables.contains(&prev_char) if (VALID_VARIABLES.contains(&prev_char)
| (')' == prev_char) | (')' == prev_char)
| numbers.contains(&prev_char)) | NUMBERS.contains(&prev_char))
&& !letters.contains(&prev_prev_char) && !LETTERS.contains(&prev_prev_char)
{ {
add_asterisk = true; add_asterisk = true;
} }
} else if numbers.contains(&prev_char) { } else if NUMBERS.contains(&prev_char) {
if (c == '(') | c_letters_var { if (c == '(') | c_letters_var {
add_asterisk = true; add_asterisk = true;
} }
} else if letters.contains(&c) { } else if LETTERS.contains(&c) {
if numbers.contains(&prev_char) if NUMBERS.contains(&prev_char)
| (valid_variables.contains(&prev_char) && valid_variables.contains(&c)) | (VALID_VARIABLES.contains(&prev_char) && VALID_VARIABLES.contains(&c))
{ {
add_asterisk = true; add_asterisk = true;
} }
} else if (numbers.contains(&c) | c_letters_var) && prev_letters_var { } else if (NUMBERS.contains(&c) | c_letters_var) && prev_letters_var {
add_asterisk = true; add_asterisk = true;
} }