aboutsummaryrefslogtreecommitdiff
path: root/azalea-language/src
diff options
context:
space:
mode:
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())
}