Skip to content

Commit 0ee2e1e

Browse files
committed
add seq2list projection
1 parent 2261c22 commit 0ee2e1e

File tree

2 files changed

+165
-0
lines changed

2 files changed

+165
-0
lines changed

src/projection/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ pub mod vec2bin;
88
pub mod vec2json;
99
pub mod vec2list;
1010
pub mod list2seq;
11+
pub mod seq2list;
1112
pub mod seq2idx;
1213
pub mod enumerate_sequence;
1314
pub mod filter_sequence;

src/projection/seq2list.rs

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
use {
2+
crate::{
3+
view::{
4+
InnerViewPort, Observer, ObserverBroadcast, ObserverExt, OuterViewPort, View, ViewPort,
5+
sequence::SequenceView,
6+
list::{ListView, ListDiff}
7+
},
8+
buffer::vec::VecDiff,
9+
projection::list2seq::List2Seq,
10+
},
11+
std::sync::Arc,
12+
std::sync::RwLock,
13+
};
14+
15+
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
16+
17+
/// Adapter View implementing `List` for `Vec`
18+
pub struct Seq2List<T>
19+
where
20+
T: Clone + Send + Sync + 'static,
21+
{
22+
pub(crate) cur_len: usize,
23+
src_view: Option<Arc<dyn SequenceView<Item = T>>>,
24+
cast: Arc<RwLock<ObserverBroadcast<dyn ListView<T>>>>,
25+
}
26+
27+
impl<T> Seq2List<T>
28+
where
29+
T: Clone + Send + Sync + 'static,
30+
{
31+
pub fn new(port: InnerViewPort<dyn ListView<T>>) -> Arc<RwLock<Self>> {
32+
let s2l = Arc::new(RwLock::new(Seq2List {
33+
cur_len: 0,
34+
src_view: None,
35+
cast: port.get_broadcast(),
36+
}));
37+
port.set_view(Some(s2l.clone()));
38+
s2l
39+
}
40+
}
41+
42+
impl<T> Observer<dyn SequenceView<Item = T>> for Seq2List<T>
43+
where
44+
T: Clone + Send + Sync + 'static,
45+
{
46+
fn reset(&mut self, view: Option<Arc<dyn SequenceView<Item = T>>>) {
47+
let old_len = self.cur_len;
48+
self.src_view = view;
49+
let new_len = if let Some(src_view) = self.src_view.as_ref() {
50+
src_view.len().unwrap_or(0)
51+
} else {
52+
0
53+
};
54+
55+
//self.cast.notify_each(0..std::cmp::max(old_len, new_len));
56+
57+
self.cur_len = 0;
58+
self.cast.notify(&ListDiff::Clear);
59+
for i in 0..new_len {
60+
self.cast.notify(&ListDiff::Insert{ idx: i, val: self.src_view.get(&i).unwrap() });
61+
}
62+
self.cur_len = new_len;
63+
}
64+
65+
fn notify(&mut self, idx: &usize) {
66+
if let Some(v) = self.src_view.get(idx) {
67+
if *idx < self.cur_len {
68+
self.cast.notify(&ListDiff::Update{ idx: *idx, val: self.src_view.get(idx).unwrap() })
69+
} else {
70+
self.cur_len += 1;
71+
self.cast.notify(&ListDiff::Insert{ idx: *idx, val: self.src_view.get(idx).unwrap() })
72+
}
73+
} else {
74+
self.cur_len -= 1;
75+
// assert!( *idx >= self.cur_len );
76+
self.cast.notify(&ListDiff::Remove(self.cur_len));
77+
}
78+
}
79+
}
80+
81+
impl<T> View for Seq2List<T>
82+
where
83+
T: Clone + Send + Sync + 'static,
84+
{
85+
type Msg = ListDiff<T>;
86+
}
87+
88+
impl<T> ListView<T> for Seq2List<T>
89+
where
90+
T: Clone + Send + Sync + 'static,
91+
{
92+
93+
fn get(&self, idx: &usize) -> Option<T> {
94+
self.src_view.as_ref()?.get(idx).clone()
95+
}
96+
97+
fn len(&self) -> Option<usize> {
98+
Some(self.cur_len)
99+
}
100+
}
101+
102+
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
103+
104+
impl<T> OuterViewPort<dyn SequenceView<Item = T>>
105+
where
106+
T: Clone + Send + Sync + 'static,
107+
{
108+
pub fn to_list(&self) -> OuterViewPort<dyn ListView<T>> {
109+
let port = ViewPort::new();
110+
port.add_update_hook(Arc::new(self.0.clone()));
111+
112+
let s2l = Seq2List::new(port.inner());
113+
self.add_observer(s2l.clone());
114+
port.into_outer()
115+
}
116+
}
117+
118+
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
119+
/*
120+
#[cfg(test)]
121+
mod tests {
122+
use crate::buffer::vec::VecBuffer;
123+
use crate::view::{
124+
port::UpdateTask,
125+
list::ListView,
126+
sequence::*
127+
};
128+
129+
#[test]
130+
fn vec_to_list_to_seq() {
131+
let mut buf = VecBuffer::<char>::new();
132+
let seq_view = buf.get_port().to_list().to_sequence();
133+
134+
assert_eq!(seq_view.get_view().len(), Some(0));
135+
136+
buf.push('a');
137+
138+
seq_view.0.update();
139+
assert_eq!(seq_view.get_view().len(), Some(1));
140+
assert_eq!(seq_view.get_view().get(&0), Some('a'));
141+
assert_eq!(seq_view.get_view().get(&1), None);
142+
143+
144+
buf.push('b');
145+
146+
seq_view.0.update();
147+
assert_eq!(seq_view.get_view().len(), Some(2));
148+
assert_eq!(seq_view.get_view().get(&0), Some('a'));
149+
assert_eq!(seq_view.get_view().get(&1), Some('b'));
150+
assert_eq!(seq_view.get_view().get(&2), None);
151+
152+
153+
buf.push('c');
154+
buf.remove(0);
155+
156+
seq_view.0.update();
157+
assert_eq!(seq_view.get_view().len(), Some(2));
158+
assert_eq!(seq_view.get_view().get(&0), Some('b'));
159+
assert_eq!(seq_view.get_view().get(&1), Some('c'));
160+
assert_eq!(seq_view.get_view().get(&2), None);
161+
}
162+
}
163+
*/
164+

0 commit comments

Comments
 (0)