use std::collections::HashSet;
use std::sync::OnceLock;
const PURE_LETTER_SHORTFORMS: &[&str] = &[
"ab", "abv", "ac", "acr", "af", "afn", "afw", "ag", "al", "alm", "alr", "alt",
"alw", "bc", "bf", "bh", "bl", "bn", "brl", "bs", "bt", "by", "cd", "dcl", "dclg", "dcv", "dcvg", "ei", "fri", "fst", "gd", "grt", "hm", "hmf", "hrf", "imm", "ll", "lr", "myf", "nec", "nei", "pd", "perh", "qk", "rcv", "rcvg", "rjc", "rjcg", "sd", "td", "tgr", "tm", "tn", "wd", "xf", "xs", "yr", "yrf", "yrvs",
];
fn shortform_set() -> &'static HashSet<&'static str> {
static CACHE: OnceLock<HashSet<&'static str>> = OnceLock::new();
CACHE.get_or_init(|| PURE_LETTER_SHORTFORMS.iter().copied().collect())
}
pub fn requires_grade1_indicator(uppercase_word: &str) -> bool {
if uppercase_word.len() < 2 {
return false;
}
if !uppercase_word.chars().all(|c| c.is_ascii_alphabetic()) {
return false;
}
let lowered = uppercase_word.to_ascii_lowercase();
shortform_set().contains(lowered.as_str())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn cd_collides_with_could() {
assert!(requires_grade1_indicator("CD"));
}
#[test]
fn hm_collides_with_him() {
assert!(requires_grade1_indicator("HM"));
}
#[test]
fn td_collides_with_today() {
assert!(requires_grade1_indicator("TD"));
}
#[test]
fn wd_collides_with_would() {
assert!(requires_grade1_indicator("WD"));
}
#[test]
fn lp_does_not_collide() {
assert!(!requires_grade1_indicator("LP"));
}
#[test]
fn kbs_does_not_collide() {
assert!(!requires_grade1_indicator("KBS"));
}
#[test]
fn mp_does_not_collide() {
assert!(!requires_grade1_indicator("MP"));
}
#[test]
fn tv_does_not_collide() {
assert!(!requires_grade1_indicator("TV"));
}
#[test]
fn sns_does_not_collide() {
assert!(!requires_grade1_indicator("SNS"));
}
#[test]
fn single_letter_excluded() {
assert!(!requires_grade1_indicator("C"));
assert!(!requires_grade1_indicator("A"));
}
#[test]
fn non_ascii_excluded() {
assert!(!requires_grade1_indicator("É"));
assert!(!requires_grade1_indicator("C1"));
}
#[test]
fn case_insensitive_input() {
assert!(requires_grade1_indicator("cd"));
}
}