diff options
| author | mat <git@matdoes.dev> | 2025-02-23 17:39:17 +0000 |
|---|---|---|
| committer | mat <git@matdoes.dev> | 2025-02-23 17:39:17 +0000 |
| commit | 6a5ab34a2db56c22e1051dfaabf98322c50f53bd (patch) | |
| tree | bf0e13174c5bbb2bc6885ea357683a030aff5465 /azalea-language/src | |
| parent | 2be4f0f2b66eb7181badec0134c3c3565e3cbd7f (diff) | |
| download | azalea-drasl-6a5ab34a2db56c22e1051dfaabf98322c50f53bd.tar.xz | |
azalea-language now does a binary search instead of a hashmap lookup
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()) } |
