use phf::phf_map;
use crate::unicode::decode_unicode;
static FUNCTION_MAP: phf::Map<&'static str, &'static [u8]> = phf_map! {
"sin" => &[decode_unicode('⠖'), decode_unicode('⠎')], "cos" => &[decode_unicode('⠖'), decode_unicode('⠉')], "tan" => &[decode_unicode('⠖'), decode_unicode('⠞')], "csc" => &[decode_unicode('⠖'), decode_unicode('⠣')], "sec" => &[decode_unicode('⠖'), decode_unicode('⠤')], "cot" => &[decode_unicode('⠖'), decode_unicode('⠳')], "sinh" => &[decode_unicode('⠖'), decode_unicode('⠎'), decode_unicode('⠓')], "cosh" => &[decode_unicode('⠖'), decode_unicode('⠉'), decode_unicode('⠓')], "tanh" => &[decode_unicode('⠖'), decode_unicode('⠞'), decode_unicode('⠓')], "arcsin" => &[decode_unicode('⠁'), decode_unicode('⠗'), decode_unicode('⠉'), decode_unicode('⠖'), decode_unicode('⠎')], "arccos" => &[decode_unicode('⠁'), decode_unicode('⠗'), decode_unicode('⠉'), decode_unicode('⠖'), decode_unicode('⠉')], "arctan" => &[decode_unicode('⠁'), decode_unicode('⠗'), decode_unicode('⠉'), decode_unicode('⠖'), decode_unicode('⠞')], "cosec" => &[decode_unicode('⠖'), decode_unicode('⠣')], "log" => &[], "lim" => &[],
};
const FUNCTION_NAMES: &[&str] = &[
"arcsin", "arccos", "arctan", "cosec", "sinh", "cosh", "tanh", "lim", "log", "sin", "cos", "tan", "csc", "sec", "cot", ];
pub fn match_function_prefix(text: &str) -> Option<(&'static str, &'static [u8])> {
for &name in FUNCTION_NAMES {
if text.starts_with(name)
&& let Some(encoding) = FUNCTION_MAP.get(name)
{
return Some((name, encoding));
}
}
None
}
pub fn encode_function(name: &str) -> Option<&'static [u8]> {
FUNCTION_MAP.get(name).copied()
}
pub fn starts_with_function(text: &str) -> bool {
match_function_prefix(text).is_some()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sin() {
let result = encode_function("sin");
assert!(result.is_some());
assert_eq!(result.unwrap(), &[22, 14]); }
#[test]
fn test_cos() {
let result = encode_function("cos");
assert!(result.is_some());
assert_eq!(result.unwrap(), &[22, 9]); }
#[test]
fn test_tan() {
let result = encode_function("tan");
assert!(result.is_some());
assert_eq!(result.unwrap(), &[22, 30]); }
#[test]
fn test_sinh() {
let result = encode_function("sinh");
assert!(result.is_some());
assert_eq!(result.unwrap(), &[22, 14, 19]); }
#[test]
fn test_match_prefix_sin3x() {
let result = match_function_prefix("sin3x");
assert!(result.is_some());
let (name, _) = result.unwrap();
assert_eq!(name, "sin");
}
#[test]
fn test_match_prefix_sinh() {
let result = match_function_prefix("sinhx");
assert!(result.is_some());
let (name, _) = result.unwrap();
assert_eq!(name, "sinh");
}
#[test]
fn test_unknown_function() {
assert!(encode_function("xyz").is_none());
}
}