lib-nested/src/main.rs

89 lines
1.8 KiB
Rust
Raw Normal View History

2020-12-04 20:38:51 +01:00
#![feature(trait_alias)]
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();
move |new_val| 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
#[async_std::main]
async fn main() {
let view_port = port::ViewPort::<(), char>::new();
let mut buf = SingletonBuffer::new(view_port.inner());
2020-12-04 20:38:51 +01:00
let view = view_port.outer().get_view();
let mut stream = view_port.outer().stream().map({
move |_| view.view(()).unwrap()
2020-12-04 20:38:51 +01:00
});
let fut = task::spawn({
async move {
while let Some(val) = stream.next().await {
println!("{}", val);
}
println!("end print task");
2020-12-04 20:38:51 +01:00
}
});
buf.update('a');
buf.update('b');
task::sleep(std::time::Duration::from_secs(1)).await;
buf.update('c');
buf.update('d');
task::sleep(std::time::Duration::from_secs(1)).await;
buf.update('e');
2020-12-04 20:38:51 +01:00
drop(buf);
drop(view_port);
2020-12-04 20:38:51 +01:00
fut.await;
}