aboutsummaryrefslogtreecommitdiff
path: root/azalea-language/src
diff options
context:
space:
mode:
authormat <git@matdoes.dev>2025-02-23 17:39:17 +0000
committermat <git@matdoes.dev>2025-02-23 17:39:17 +0000
commit6a5ab34a2db56c22e1051dfaabf98322c50f53bd (patch)
treebf0e13174c5bbb2bc6885ea357683a030aff5465 /azalea-language/src
parent2be4f0f2b66eb7181badec0134c3c3565e3cbd7f (diff)
downloadazalea-drasl-6a5ab34a2db56c22e1051dfaabf98322c50f53bd.tar.xz
azalea-language now does a binary search instead of a hashmap lookup
Diffstat (limited to 'azalea-language/src')
-rwxr-xr-xazalea-language/src/lib.rs19
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())
}