flams_system/backend/
cache.rs1use 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}