summaryrefslogtreecommitdiffstats
path: root/vendor/intl-memoizer/src/concurrent.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/intl-memoizer/src/concurrent.rs')
-rw-r--r--vendor/intl-memoizer/src/concurrent.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/vendor/intl-memoizer/src/concurrent.rs b/vendor/intl-memoizer/src/concurrent.rs
new file mode 100644
index 000000000..95553281b
--- /dev/null
+++ b/vendor/intl-memoizer/src/concurrent.rs
@@ -0,0 +1,39 @@
+use super::*;
+use std::sync::Mutex;
+
+#[derive(Debug)]
+pub struct IntlLangMemoizer {
+ lang: LanguageIdentifier,
+ map: Mutex<type_map::concurrent::TypeMap>,
+}
+
+impl IntlLangMemoizer {
+ pub fn new(lang: LanguageIdentifier) -> Self {
+ Self {
+ lang,
+ map: Mutex::new(type_map::concurrent::TypeMap::new()),
+ }
+ }
+
+ pub fn with_try_get<I, R, U>(&self, args: I::Args, cb: U) -> Result<R, I::Error>
+ where
+ Self: Sized,
+ I: Memoizable + Sync + Send + 'static,
+ I::Args: Send + Sync + 'static,
+ U: FnOnce(&I) -> R,
+ {
+ let mut map = self.map.lock().unwrap();
+ let cache = map
+ .entry::<HashMap<I::Args, I>>()
+ .or_insert_with(HashMap::new);
+
+ let e = match cache.entry(args.clone()) {
+ Entry::Occupied(entry) => entry.into_mut(),
+ Entry::Vacant(entry) => {
+ let val = I::construct(self.lang.clone(), args)?;
+ entry.insert(val)
+ }
+ };
+ Ok(cb(&e))
+ }
+}