Skip to main content

pito_list/
shared.rs

1use std::{borrow::Cow, fmt, sync::Arc};
2
3use crate::{Row, Source};
4
5pub trait Build<T> {
6    fn row(&self, index: usize, item: &T) -> Row;
7
8    fn selectable(&self, index: usize, item: &T) -> bool {
9        self.row(index, item).selectable()
10    }
11}
12
13impl<T, F: Fn(usize, &T) -> Row> Build<T> for F {
14    fn row(&self, index: usize, item: &T) -> Row {
15        self(index, item)
16    }
17}
18
19pub struct Shared<T, B = fn(usize, &T) -> Row> {
20    items: Arc<Vec<T>>,
21    builder: B,
22    marks: u16,
23}
24
25impl<T, B> Shared<T, B> {
26    pub fn new(items: Arc<Vec<T>>, builder: B) -> Self {
27        Shared {
28            items,
29            builder,
30            marks: 0,
31        }
32    }
33
34    pub fn marks(mut self, width: u16) -> Self {
35        self.marks = width;
36        self
37    }
38
39    pub fn set_marks(&mut self, width: u16) {
40        self.marks = width;
41    }
42
43    pub fn items(&self) -> &Arc<Vec<T>> {
44        &self.items
45    }
46
47    pub fn set_items(&mut self, items: Arc<Vec<T>>) {
48        self.items = items;
49    }
50
51    pub fn builder(&self) -> &B {
52        &self.builder
53    }
54
55    pub fn builder_mut(&mut self) -> &mut B {
56        &mut self.builder
57    }
58}
59
60impl<T, B: Build<T>> Source for Shared<T, B> {
61    fn len(&self) -> usize {
62        self.items.len()
63    }
64
65    fn row(&self, index: usize) -> Cow<'_, Row> {
66        Cow::Owned(self.builder.row(index, &self.items[index]))
67    }
68
69    fn selectable(&self, index: usize) -> bool {
70        self.builder.selectable(index, &self.items[index])
71    }
72
73    fn mark_width(&self) -> u16 {
74        self.marks
75    }
76}
77
78impl<T, B: Clone> Clone for Shared<T, B> {
79    fn clone(&self) -> Self {
80        Shared {
81            items: Arc::clone(&self.items),
82            builder: self.builder.clone(),
83            marks: self.marks,
84        }
85    }
86}
87
88impl<T, B: Default> Default for Shared<T, B> {
89    fn default() -> Self {
90        Shared::new(Arc::default(), B::default())
91    }
92}
93
94impl<T, B> fmt::Debug for Shared<T, B> {
95    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
96        f.debug_struct("Shared")
97            .field("len", &self.items.len())
98            .field("marks", &self.marks)
99            .finish_non_exhaustive()
100    }
101}