use { std::sync::{Arc, RwLock}, crate::core::{ View, Observer, ObserverBroadcast, NotifyFnObserver, ResetFnObserver, channel::{ ChannelData, ChannelSender, ChannelReceiver } } }; /*\ <<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> View Port <<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> \*/ #[derive(Clone)] pub struct ViewPort { view: Arc>>>, observers: Arc>> } impl ViewPort { pub fn new() -> Self { ViewPort { view: Arc::new(RwLock::new(None)), observers: Arc::new(RwLock::new(ObserverBroadcast::new())) } } pub fn with_view(view: Arc) -> Self { let port = ViewPort::new(); port.set_view(Some(view)); port } pub fn set_view(&self, view: Option>) { *self.view.write().unwrap() = view.clone(); self.observers.read().unwrap().reset(view); } pub fn add_observer(&self, observer: Arc>) { self.observers.write().unwrap().add_observer(Arc::downgrade(&observer)); observer.reset(self.view.read().unwrap().clone()); } pub fn inner(&self) -> InnerViewPort { InnerViewPort(ViewPort{ view: self.view.clone(), observers: self.observers.clone() }) } pub fn outer(&self) -> OuterViewPort { OuterViewPort(ViewPort{ view: self.view.clone(), observers: self.observers.clone() }) } pub fn into_inner(self) -> InnerViewPort { InnerViewPort(ViewPort{ view: self.view, observers: self.observers }) } pub fn into_outer(self) -> OuterViewPort { OuterViewPort(ViewPort{ view: self.view, observers: self.observers }) } } //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> #[derive(Clone)] pub struct InnerViewPort(ViewPort); #[derive(Clone)] pub struct OuterViewPort(ViewPort); //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> impl InnerViewPort { pub fn get_broadcast(&self) -> Arc>> { self.0.observers.clone() } pub fn set_view(&self, view: Option>) -> Arc>> { self.0.set_view(view); self.get_broadcast() } pub fn get_view(&self) -> Option> { self.0.view.read().unwrap().clone() } pub fn notify(&self, msg: &V::Msg) { self.0.observers.read().unwrap().notify(msg); } } //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> impl OuterViewPort { pub fn get_view(&self) -> Option> { self.0.view.read().unwrap().clone() } pub fn get_view_arc(&self) -> Arc>>> { self.0.view.clone() } pub fn add_observer(&self, observer: Arc>) -> Arc>>> { self.0.add_observer(observer); self.get_view_arc() } /* pub fn add_reset_fn(&self, reset: impl Fn(Option>) + Send + Sync + 'static) -> Arc>>> { self.add_observer(Arc::new(ResetFnObserver::new(reset))) } pub fn add_notify_fn(&self, notify: impl Fn(&V::Msg) + Send + Sync + 'static) -> Arc>>> { self.add_observer(Arc::new(NotifyFnObserver::new(notify))) } */ } /* impl OuterViewPort where V::Msg: Clone { pub fn into_stream( self, reset: impl Fn(Option>, ChannelSender) + Send + Sync + 'static ) -> ChannelReceiver where Data: ChannelData + 'static, Data::IntoIter: Send + Sync + 'static { let (s, r) = crate::core::channel::channel::(); self.add_observer(Arc::new(s.clone())); self.add_reset_fn( move |view| { reset(view, s.clone()); } ); r } } */