lib-nested/src/main.rs

142 lines
3 KiB
Rust
Raw Normal View History

2020-12-04 20:38:51 +01:00
#![feature(trait_alias)]
2020-12-08 15:51:24 +01:00
#![feature(assoc_char_funcs)]
2020-12-04 20:38:51 +01:00
pub mod view;
pub mod port;
pub mod channel;
use {
async_std::{
prelude::*, task, stream
},
std::{
sync::{Arc, RwLock}
},
cgmath::{Vector2},
crate::{
view::{View, Observer},
port::{InnerViewPort, OuterViewPort}
}
};
2020-12-04 20:38:51 +01:00
struct SingletonBuffer<T: Clone + Eq + Send + Sync + 'static> {
data: Arc<RwLock<Option<T>>>,
port: InnerViewPort<(), T>
}
impl<T: Clone + Eq + Send + Sync + 'static> SingletonBuffer<T> {
fn new(
port: InnerViewPort<(), T>
) -> Self {
let data = Arc::new(RwLock::new(None));
port.set_view_fn({
let data = data.clone();
2020-12-08 15:51:24 +01:00
move |_| data.read().unwrap().clone()
});
SingletonBuffer {
data,
port
}
}
2020-12-04 20:38:51 +01:00
fn update(&mut self, new_value: T) {
let mut data = self.data.write().unwrap();
if *data != Some(new_value.clone()) {
*data = Some(new_value);
drop(data);
self.port.notify(());
}
}
}
2020-12-04 20:38:51 +01:00
2020-12-08 15:51:24 +01:00
impl<T: Clone + Send + Sync> View for Vec<T> {
type Key = usize;
type Value = T;
fn view(&self, key: usize) -> Option<T> {
self.get(key).cloned()
}
}
struct VecBuffer<T: Clone + Eq + Send + Sync + 'static> {
data: Arc<RwLock<Vec<T>>>,
port: InnerViewPort<usize, T>
}
impl<T: Clone + Eq + Send + Sync + 'static> VecBuffer<T> {
fn new(port: InnerViewPort<usize, T>) -> Self {
let data = Arc::new(RwLock::new(Vec::new()));
port.set_view(data.clone());
VecBuffer { data, port }
}
fn push(&mut self, val: T) {
self.port.notify({
let mut d = self.data.write().unwrap();
let len = d.len();
d.push(val);
len
});
}
}
2020-12-04 20:38:51 +01:00
#[async_std::main]
async fn main() {
2020-12-08 15:51:24 +01:00
let digits = port::ViewPort::new();
let mut buf = VecBuffer::new(digits.inner());
let digit_view = digits.outer()
// digit encoding
.map_value(
|digit|
if let Some(digit) = digit {
char::from_digit(digit, 16)
} else {
None
}
)
2020-12-08 15:51:24 +01:00
// simple horizontal layout
.map_key(
|idx| Vector2::<i16>::new(idx as i16, 0),
|pos| pos.x as usize
);
2020-12-04 20:38:51 +01:00
2020-12-08 15:51:24 +01:00
let view = digit_view.get_view();
let mut stream = digit_view.stream().map({
move |idx| (idx, view.view(idx))
2020-12-04 20:38:51 +01:00
});
let fut = task::spawn({
async move {
2020-12-08 15:51:24 +01:00
while let Some((idx, val)) = stream.next().await {
println!("v[{:?}] = {:?}", idx, val);
}
println!("end print task");
2020-12-04 20:38:51 +01:00
}
});
2020-12-08 15:51:24 +01:00
buf.push(0);
buf.push(1);
task::sleep(std::time::Duration::from_secs(1)).await;
2020-12-08 15:51:24 +01:00
buf.push(2);
buf.push(3);
task::sleep(std::time::Duration::from_secs(1)).await;
2020-12-08 15:51:24 +01:00
buf.push(4);
2020-12-04 20:38:51 +01:00
drop(buf);
2020-12-08 15:51:24 +01:00
drop(digits);
drop(digit_view);
2020-12-04 20:38:51 +01:00
fut.await;
}