diff options
Diffstat (limited to 'azalea-language/src')
| -rwxr-xr-x | azalea-language/src/lib.rs | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/azalea-language/src/lib.rs b/azalea-language/src/lib.rs index bb5d144e..d86a2697 100755 --- a/azalea-language/src/lib.rs +++ b/azalea-language/src/lib.rs @@ -4,9 +4,22 @@ use std::{collections::HashMap, sync::LazyLock}; use compact_str::CompactString; -pub static STORAGE: LazyLock<HashMap<CompactString, CompactString>> = - LazyLock::new(|| serde_json::from_str(include_str!("en_us.json")).unwrap()); +pub static STORAGE: LazyLock<Vec<(CompactString, CompactString)>> = LazyLock::new(|| { + let json = + serde_json::from_str::<HashMap<CompactString, CompactString>>(include_str!("en_us.json")) + .unwrap(); + let mut json = json.into_iter().collect::<Vec<_>>(); + + // sort by key to make binary search work + json.sort_by(|a, b| a.0.cmp(&b.0)); + + json +}); pub fn get(key: &str) -> Option<&str> { - STORAGE.get(key).map(|s| s.as_str()) + let key = CompactString::from(key); + let storage = &*STORAGE; + // more memory efficient than a hashmap lookup + let index = storage.binary_search_by(|(k, _)| k.cmp(&key)); + index.ok().map(|i| storage[i].1.as_str()) } |
