flams_system/backend/
cache.rs

1use flams_ontology::{
2    content::modules::Module,
3    narration::documents::Document,
4    uris::{DocumentURI, ModuleURI},
5};
6use flams_utils::prelude::HMap;
7
8#[derive(Default, Debug)]
9pub(super) struct BackendCache {
10    modules: HMap<ModuleURI, Module>,
11    documents: HMap<DocumentURI, Document>,
12}
13
14impl BackendCache {
15    const EVERY_MODS: usize = 500;
16    const EVERY_DOCS: usize = 500;
17
18    pub fn clear(&mut self) {
19        self.modules.clear();
20        self.documents.clear();
21    }
22
23    #[inline]
24    fn gc(&mut self) {
25        if self.modules.len() >= Self::EVERY_MODS {
26            self.modules.retain(|_, v| v.strong_count() > 1);
27        }
28        if self.documents.len() >= Self::EVERY_DOCS {
29            self.documents.retain(|_, v| v.strong_count() > 1);
30        }
31    }
32
33    #[inline]
34    pub(super) fn has_document(&self, uri: &DocumentURI) -> Option<&Document> {
35        self.documents.get(uri)
36    }
37
38    #[inline]
39    pub(super) fn insert_document(&mut self, doc: Document) {
40        self.gc();
41        self.documents.insert(doc.uri().clone(), doc);
42    }
43
44    #[inline]
45    pub(super) fn has_module(&self, uri: &ModuleURI) -> Option<&Module> {
46        self.modules.get(uri)
47    }
48
49    #[inline]
50    pub(super) fn insert_module(&mut self, m: Module) {
51        self.gc();
52        self.modules.insert(m.uri().clone(), m);
53    }
54}