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}