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