television_screen/
cache.rs

1use devicons::FileIcon;
2use rustc_hash::FxHashMap;
3use std::sync::Arc;
4
5use ratatui::widgets::Paragraph;
6use television_utils::cache::RingSet;
7
8const DEFAULT_RENDERED_PREVIEW_CACHE_SIZE: usize = 10;
9
10#[derive(Clone, Debug)]
11pub struct CachedPreview<'a> {
12    pub key: String,
13    pub icon: Option<FileIcon>,
14    pub title: String,
15    pub paragraph: Arc<Paragraph<'a>>,
16}
17
18impl<'a> CachedPreview<'a> {
19    pub fn new(
20        key: String,
21        icon: Option<FileIcon>,
22        title: String,
23        paragraph: Arc<Paragraph<'a>>,
24    ) -> Self {
25        CachedPreview {
26            key,
27            icon,
28            title,
29            paragraph,
30        }
31    }
32}
33
34#[derive(Debug)]
35pub struct RenderedPreviewCache<'a> {
36    previews: FxHashMap<String, CachedPreview<'a>>,
37    ring_set: RingSet<String>,
38    pub last_preview: Option<CachedPreview<'a>>,
39}
40
41impl<'a> RenderedPreviewCache<'a> {
42    pub fn new(capacity: usize) -> Self {
43        RenderedPreviewCache {
44            previews: FxHashMap::default(),
45            ring_set: RingSet::with_capacity(capacity),
46            last_preview: None,
47        }
48    }
49
50    pub fn get(&self, key: &str) -> Option<CachedPreview<'a>> {
51        self.previews.get(key).cloned()
52    }
53
54    pub fn insert(
55        &mut self,
56        key: String,
57        icon: Option<FileIcon>,
58        title: &str,
59        paragraph: &Arc<Paragraph<'a>>,
60    ) {
61        let cached_preview = CachedPreview::new(
62            key.clone(),
63            icon,
64            title.to_string(),
65            paragraph.clone(),
66        );
67        self.last_preview = Some(cached_preview.clone());
68        self.previews.insert(key.clone(), cached_preview);
69        if let Some(oldest_key) = self.ring_set.push(key) {
70            self.previews.remove(&oldest_key);
71        }
72    }
73}
74
75impl Default for RenderedPreviewCache<'_> {
76    fn default() -> Self {
77        RenderedPreviewCache::new(DEFAULT_RENDERED_PREVIEW_CACHE_SIZE)
78    }
79}