From 508e716a6a437f1566de68e5d630ecdcb1550c81 Mon Sep 17 00:00:00 2001 From: Michael Sippel <micha@fragmental.art> Date: Sun, 4 Aug 2024 19:27:36 +0200 Subject: [PATCH] repr tree: split leaf & node into separate files --- lib-nested-core/src/repr_tree/leaf.rs | 216 +++++++++++ lib-nested-core/src/repr_tree/mod.rs | 518 +------------------------- lib-nested-core/src/repr_tree/node.rs | 348 +++++++++++++++++ 3 files changed, 568 insertions(+), 514 deletions(-) create mode 100644 lib-nested-core/src/repr_tree/leaf.rs create mode 100644 lib-nested-core/src/repr_tree/node.rs diff --git a/lib-nested-core/src/repr_tree/leaf.rs b/lib-nested-core/src/repr_tree/leaf.rs new file mode 100644 index 0000000..6a12440 --- /dev/null +++ b/lib-nested-core/src/repr_tree/leaf.rs @@ -0,0 +1,216 @@ +use { + r3vi::{ + view::{ + ViewPort, OuterViewPort, + AnyViewPort, AnyInnerViewPort, AnyOuterViewPort, + port::UpdateTask, + View, Observer, + singleton::*, + sequence::*, + list::* + }, + buffer::{singleton::*, vec::*} + }, + laddertypes::{TypeTerm}, + std::{ + collections::HashMap, + sync::{Arc, RwLock}, + any::Any + }, +}; + +//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + +#[derive(Clone)] +pub struct ReprLeaf { + out_port: AnyViewPort, + in_port: AnyInnerViewPort, + data: Option< Arc<dyn Any + Send + Sync> >, + + /// keepalive for the observer that updates the buffer from in_port + keepalive: Option<Arc<dyn Any + Send + Sync>>, + in_keepalive: Option<Arc<dyn Any + Send + Sync>>, +} + +//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + +impl ReprLeaf { + pub fn from_view<V>( src_port: OuterViewPort<V> ) -> Self + where V: View + ?Sized + 'static, + V::Msg: Clone + { + let mut in_port = ViewPort::<V>::new(); + let in_keepalive = in_port.attach_to(src_port); + + let mut out_port = ViewPort::<V>::new(); + let out_keepalive = out_port.attach_to(in_port.outer()); + + ReprLeaf { + keepalive: Some(out_keepalive), + in_keepalive: Some(in_keepalive), + in_port: in_port.inner().into(), + out_port: out_port.into(), + data: None, + } + } + + pub fn detach<V>(&mut self) + where V: View + ?Sized + 'static, + V::Msg: Clone + { + self.keepalive = None; + self.in_keepalive = None; + + let ip = self.in_port.clone() + .downcast::<V>().ok() + .unwrap(); + ip.0.detach(); + + if self.data.is_none() { + let mut op = self.out_port.clone() + .downcast::<V>().ok() + .unwrap(); + + op.detach(); + self.keepalive = Some(op.attach_to(ip.0.outer())); + } + } + + pub fn detach_vec<Item>(&mut self) + where Item: Clone + Send + Sync + 'static + { + self.keepalive = None; + self.in_keepalive = None; + + let ip = self.in_port.clone() + .downcast::<dyn ListView<Item>>().ok() + .unwrap(); + + ip.0.detach(); + + if let Some(data) = self.data.as_mut() { + let mut op = self.out_port.clone() + .downcast::<RwLock<Vec<Item>>>().ok() + .unwrap(); + op.detach(); + + let data = data.clone().downcast::< RwLock<Vec<Item>> >().ok().unwrap(); + let buffer = VecBuffer::with_data_arc_port(data, op.inner()); + self.keepalive = Some(buffer.attach_to(ip.0.outer())) + } + } + + pub fn attach_to<V>(&mut self, src_port: OuterViewPort<V>) + where V: View + ?Sized + 'static, + V::Msg: Clone + { + self.in_keepalive = Some(self.in_port.clone() + .downcast::<V>().ok().unwrap() + .0.attach_to( src_port )); + } + + pub fn from_singleton_buffer<T>( buffer: SingletonBuffer<T> ) -> Self + where T: Clone + Send + Sync + 'static + { + let in_port = ViewPort::<dyn SingletonView<Item = T>>::new(); + ReprLeaf { + in_keepalive: None, + keepalive: Some(buffer.attach_to(in_port.outer())), + in_port: in_port.inner().into(), + out_port: buffer.get_port().0.into(), + data: Some(buffer.into_inner()) + } + } + + pub fn from_vec_buffer<T>( buffer: VecBuffer<T> ) -> Self + where T: Clone + Send + Sync + 'static + { + let in_port = ViewPort::< dyn ListView<T> >::new(); + ReprLeaf { + in_keepalive: None, + keepalive: Some(buffer.attach_to(in_port.outer())), + in_port: in_port.inner().into(), + out_port: buffer.get_port().0.into(), + data: Some(buffer.into_inner()) + } + } + + pub fn as_singleton_buffer<T>(&mut self) -> Option<SingletonBuffer<T>> + where T: Clone + Send + Sync + 'static + { + let sgl_port = self.get_port::< dyn SingletonView<Item = T> >().unwrap().0; + + let data_arc = + if let Some(data) = self.data.as_ref() { + data.clone().downcast::<RwLock<T>>().ok() + } else { + sgl_port.update(); + let value = sgl_port.outer().get_view().unwrap().get(); + eprintln!("make new data ARC from old value"); + Some(Arc::new(RwLock::new( value ))) + }; + + if let Some(data_arc) = data_arc { + self.data = Some(data_arc.clone() as Arc<dyn Any + Send + Sync>); + let buf = SingletonBuffer { + value: data_arc, + port: sgl_port.inner() + }; + self.keepalive = Some(buf.attach_to( + self.in_port.0.clone() + .downcast::<dyn SingletonView<Item = T>>() + .ok().unwrap() + .outer() + )); + Some(buf) + } else { + None + } + } + + pub fn as_vec_buffer<T>(&mut self) -> Option<VecBuffer<T>> + where T: Clone + Send + Sync + 'static + { + let vec_port = self.get_port::< RwLock<Vec<T>> >().unwrap().0; + + let data_arc = + if let Some(data) = self.data.as_ref() { + data.clone().downcast::<RwLock<Vec<T>>>().ok() + } else { + vec_port.update(); + if let Some(value) = vec_port.outer().get_view() { + let value = value.read().unwrap().clone(); + eprintln!("make new data ARC from old VECTOR-value"); + Some(Arc::new(RwLock::new( value ))) + } else { + eprintln!("no data vec"); + Some(Arc::new(RwLock::new( Vec::new() ))) +// None + } + }; + + if let Some(data_arc) = data_arc { + self.data = Some(data_arc.clone() as Arc<dyn Any + Send + Sync>); + let buf = VecBuffer::with_data_arc_port(data_arc, vec_port.inner()); + self.keepalive = Some(buf.attach_to( + self.in_port.0.clone() + .downcast::< dyn ListView<T> >() + .ok().unwrap() + .outer() + )); + Some(buf) + } else { + None + } + } + + pub fn get_port<V>(&self) -> Option<OuterViewPort<V>> + where V: View + ?Sized + 'static, + V::Msg: Clone + { + self.out_port.clone().downcast::<V>().ok().map(|p| p.outer()) + } +} + +//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + diff --git a/lib-nested-core/src/repr_tree/mod.rs b/lib-nested-core/src/repr_tree/mod.rs index ac1d18b..c2b71d4 100644 --- a/lib-nested-core/src/repr_tree/mod.rs +++ b/lib-nested-core/src/repr_tree/mod.rs @@ -1,3 +1,5 @@ +pub mod node; +pub mod leaf; pub mod context; pub mod morphism; @@ -6,6 +8,8 @@ mod tests; pub use { context::{Context}, + leaf::ReprLeaf, + node::ReprTree, morphism::{MorphismType, GenericReprTreeMorphism, MorphismBase} }; @@ -30,520 +34,6 @@ use { }, }; -//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> - -#[derive(Clone)] -pub struct ReprLeaf { - out_port: AnyViewPort, - in_port: AnyInnerViewPort, - data: Option< Arc<dyn Any + Send + Sync> >, - - /// keepalive for the observer that updates the buffer from in_port - keepalive: Option<Arc<dyn Any + Send + Sync>>, - in_keepalive: Option<Arc<dyn Any + Send + Sync>>, -} - -#[derive(Clone)] -pub struct ReprTree { - halo: TypeTerm, - type_tag: TypeTerm, - branches: HashMap<TypeTerm, Arc<RwLock<ReprTree>>>, - leaf: Option< ReprLeaf > -} - -//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> - -impl std::fmt::Debug for ReprTree { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - writeln!(f, "| type: {:?}", self.type_tag)?; - - for (_k,x) in self.branches.iter() { - writeln!(f, "|--> child: {:?}", x)?; - } - - Ok(()) - } -} - -//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> - -impl ReprLeaf { - pub fn from_view<V>( src_port: OuterViewPort<V> ) -> Self - where V: View + ?Sized + 'static, - V::Msg: Clone - { - let mut in_port = ViewPort::<V>::new(); - let in_keepalive = in_port.attach_to(src_port); - - let mut out_port = ViewPort::<V>::new(); - let out_keepalive = out_port.attach_to(in_port.outer()); - - ReprLeaf { - keepalive: Some(out_keepalive), - in_keepalive: Some(in_keepalive), - in_port: in_port.inner().into(), - out_port: out_port.into(), - data: None, - } - } - - pub fn detach<V>(&mut self) - where V: View + ?Sized + 'static, - V::Msg: Clone - { - self.keepalive = None; - self.in_keepalive = None; - - let ip = self.in_port.clone() - .downcast::<V>().ok() - .unwrap(); - ip.0.detach(); - - if self.data.is_none() { - let mut op = self.out_port.clone() - .downcast::<V>().ok() - .unwrap(); - - op.detach(); - self.keepalive = Some(op.attach_to(ip.0.outer())); - } - } - - pub fn detach_vec<Item>(&mut self) - where Item: Clone + Send + Sync + 'static - { - self.keepalive = None; - self.in_keepalive = None; - - let ip = self.in_port.clone() - .downcast::<dyn ListView<Item>>().ok() - .unwrap(); - - ip.0.detach(); - - if let Some(data) = self.data.as_mut() { - let mut op = self.out_port.clone() - .downcast::<RwLock<Vec<Item>>>().ok() - .unwrap(); - op.detach(); - - let data = data.clone().downcast::< RwLock<Vec<Item>> >().ok().unwrap(); - let buffer = VecBuffer::with_data_arc_port(data, op.inner()); - self.keepalive = Some(buffer.attach_to(ip.0.outer())) - } - } - - pub fn attach_to<V>(&mut self, src_port: OuterViewPort<V>) - where V: View + ?Sized + 'static, - V::Msg: Clone - { - self.in_keepalive = Some(self.in_port.clone() - .downcast::<V>().ok().unwrap() - .0.attach_to( src_port )); - } - - pub fn from_singleton_buffer<T>( buffer: SingletonBuffer<T> ) -> Self - where T: Clone + Send + Sync + 'static - { - let in_port = ViewPort::<dyn SingletonView<Item = T>>::new(); - ReprLeaf { - in_keepalive: None, - keepalive: Some(buffer.attach_to(in_port.outer())), - in_port: in_port.inner().into(), - out_port: buffer.get_port().0.into(), - data: Some(buffer.into_inner()) - } - } - - pub fn from_vec_buffer<T>( buffer: VecBuffer<T> ) -> Self - where T: Clone + Send + Sync + 'static - { - let in_port = ViewPort::< dyn ListView<T> >::new(); - ReprLeaf { - in_keepalive: None, - keepalive: Some(buffer.attach_to(in_port.outer())), - in_port: in_port.inner().into(), - out_port: buffer.get_port().0.into(), - data: Some(buffer.into_inner()) - } - } - - pub fn as_singleton_buffer<T>(&mut self) -> Option<SingletonBuffer<T>> - where T: Clone + Send + Sync + 'static - { - let sgl_port = self.get_port::< dyn SingletonView<Item = T> >().unwrap().0; - - let data_arc = - if let Some(data) = self.data.as_ref() { - data.clone().downcast::<RwLock<T>>().ok() - } else { - sgl_port.update(); - let value = sgl_port.outer().get_view().unwrap().get(); - eprintln!("make new data ARC from old value"); - Some(Arc::new(RwLock::new( value ))) - }; - - if let Some(data_arc) = data_arc { - self.data = Some(data_arc.clone() as Arc<dyn Any + Send + Sync>); - let buf = SingletonBuffer { - value: data_arc, - port: sgl_port.inner() - }; - self.keepalive = Some(buf.attach_to( - self.in_port.0.clone() - .downcast::<dyn SingletonView<Item = T>>() - .ok().unwrap() - .outer() - )); - Some(buf) - } else { - None - } - } - - pub fn as_vec_buffer<T>(&mut self) -> Option<VecBuffer<T>> - where T: Clone + Send + Sync + 'static - { - let vec_port = self.get_port::< RwLock<Vec<T>> >().unwrap().0; - - let data_arc = - if let Some(data) = self.data.as_ref() { - data.clone().downcast::<RwLock<Vec<T>>>().ok() - } else { - vec_port.update(); - if let Some(value) = vec_port.outer().get_view() { - let value = value.read().unwrap().clone(); - eprintln!("make new data ARC from old VECTOR-value"); - Some(Arc::new(RwLock::new( value ))) - } else { - eprintln!("no data vec"); - Some(Arc::new(RwLock::new( Vec::new() ))) -// None - } - }; - - if let Some(data_arc) = data_arc { - self.data = Some(data_arc.clone() as Arc<dyn Any + Send + Sync>); - let buf = VecBuffer::with_data_arc_port(data_arc, vec_port.inner()); - self.keepalive = Some(buf.attach_to( - self.in_port.0.clone() - .downcast::< dyn ListView<T> >() - .ok().unwrap() - .outer() - )); - Some(buf) - } else { - None - } - } - - pub fn get_port<V>(&self) -> Option<OuterViewPort<V>> - where V: View + ?Sized + 'static, - V::Msg: Clone - { - self.out_port.clone().downcast::<V>().ok().map(|p| p.outer()) - } -} - -//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> - -impl ReprTree { - pub fn new(type_tag: impl Into<TypeTerm>) -> Self { - let type_tag = type_tag.into(); - - assert!(type_tag.is_flat()); - - ReprTree { - halo: TypeTerm::unit(), - type_tag: type_tag.clone(), - branches: HashMap::new(), - leaf: None - } - } - - pub fn new_arc(type_tag: impl Into<TypeTerm>) -> Arc<RwLock<Self>> { - Arc::new(RwLock::new(Self::new(type_tag))) - } - - pub fn get_type(&self) -> &TypeTerm { - &self.type_tag - } - - pub fn set_halo(&mut self, halo_type: impl Into<TypeTerm>) { - self.halo = halo_type.into(); - for (branch_type, branch) in self.branches.iter() { - branch.write().unwrap().set_halo( TypeTerm::Ladder(vec![ - self.halo.clone(), - self.type_tag.clone() - ]).normalize() - ); - } - } - - pub fn get_halo_type(&self) -> &TypeTerm { - &self.halo - } - - pub fn get_leaf_types(&self) -> Vec< TypeTerm > { - let mut leaf_types = Vec::new(); - if self.leaf.is_some() { - leaf_types.push( self.get_type().clone() ); - } - for (branch_type, branch) in self.branches.iter() { - for t in branch.read().unwrap().get_leaf_types() { - leaf_types.push(TypeTerm::Ladder(vec![ - self.get_type().clone(), - t - ]).normalize()) - } - } - leaf_types - } - - pub fn insert_branch(&mut self, repr: Arc<RwLock<ReprTree>>) { - let branch_type = repr.read().unwrap().get_type().clone(); - - assert!(branch_type.is_flat()); - - repr.write().unwrap().set_halo( TypeTerm::Ladder(vec![ - self.halo.clone(), - self.type_tag.clone() - ]).normalize() ); - - self.branches.insert(branch_type, repr.clone()); - } - - pub fn from_char(ctx: &Arc<RwLock<Context>>, c: char ) -> Arc<RwLock<Self>> { - ReprTree::from_singleton_buffer( - Context::parse(ctx, "Char"), - SingletonBuffer::new(c) - ) - } - - pub fn from_view<V>( type_tag: impl Into<TypeTerm>, view: OuterViewPort<V> ) -> Arc<RwLock<Self>> - where V: View + ?Sized + 'static, - V::Msg: Clone - { - let mut rt = ReprTree::new(type_tag); - rt.leaf = Some(ReprLeaf::from_view(view)); - Arc::new(RwLock::new(rt)) - } - - pub fn from_singleton_buffer<T>( type_tag: impl Into<TypeTerm>, buf: SingletonBuffer<T> ) -> Arc<RwLock<Self>> - where T: Clone + Send + Sync + 'static - { - let mut rt = ReprTree::new(type_tag); - rt.leaf = Some(ReprLeaf::from_singleton_buffer(buf)); - Arc::new(RwLock::new(rt)) - } - - pub fn from_vec_buffer<T>( type_tag: impl Into<TypeTerm>, buf: VecBuffer<T> ) -> Arc<RwLock<Self>> - where T: Clone + Send + Sync + 'static - { - let mut rt = ReprTree::new(type_tag); - rt.leaf = Some(ReprLeaf::from_vec_buffer(buf)); - Arc::new(RwLock::new(rt)) - } - - pub fn attach_to<V>( - &mut self, - src_port: OuterViewPort<V> - ) - where V: View + ?Sized + 'static, - V::Msg: Clone - { - if let Some(leaf) = self.leaf.as_mut() { - leaf.attach_to(src_port); - } else { - eprintln!("cant attach branch without leaf"); - } - } - - /// find, and if necessary, create corresponding path in repr-tree. - /// Attach src_port to input of that node - pub fn attach_leaf_to<V>( - &mut self, - mut type_ladder: impl Iterator<Item = TypeTerm>, - src_port: OuterViewPort<V> - ) - where V: View + ?Sized + 'static, - V::Msg: Clone - { - while let Some(rung_type) = type_ladder.next() { - if &rung_type != self.get_type() { - if let Some(next_repr) = self.branches.get(&rung_type) { - next_repr.write().unwrap().attach_leaf_to(type_ladder, src_port); - } else { - let mut next_repr = ReprTree::new(rung_type.clone()); - next_repr.attach_leaf_to(type_ladder, src_port); - self.insert_branch(Arc::new(RwLock::new(next_repr))); - } - return; - } - } - - if let Some(leaf) = self.leaf.as_mut() { - leaf.attach_to(src_port); - } else { - self.leaf = Some(ReprLeaf::from_view(src_port)); - } - } - - pub fn detach(&mut self, ctx: &Arc<RwLock<Context>>) { - if let Some(leaf) = self.leaf.as_mut() { - if self.type_tag == Context::parse(&ctx, "Char") { - leaf.detach::<dyn SingletonView<Item = char>>(); - } - if self.type_tag == Context::parse(&ctx, "<Vec Char>") { - leaf.detach_vec::<char>(); - } - if self.type_tag == Context::parse(&ctx, "<List Char>") { - leaf.detach::<dyn ListView<char>>(); - } - } - - for (t,b) in self.branches.iter_mut() { - b.write().unwrap().detach(&ctx); - } - } - - pub fn insert_leaf( - &mut self, - mut type_ladder: impl Iterator<Item = TypeTerm>, - leaf: ReprLeaf - ) { - while let Some(type_term) = type_ladder.next() { - if &type_term != self.get_type() { - if let Some(next_repr) = self.branches.get(&type_term) { - next_repr.write().unwrap().insert_leaf(type_ladder, leaf.clone()); - } else { - let mut next_repr = ReprTree::new(type_term.clone()); - next_repr.insert_leaf(type_ladder, leaf.clone()); - self.insert_branch(Arc::new(RwLock::new(next_repr))); - } - return; - } - } - - self.leaf = Some(leaf); - } - - //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> - - pub fn descend_one(&self, dst_type: impl Into<TypeTerm>) -> Option<Arc<RwLock<ReprTree>>> { - let dst_type = dst_type.into(); - assert!( dst_type.is_flat() ); - self.branches.get(&dst_type).cloned() - } - - pub fn descend_ladder(rt: &Arc<RwLock<Self>>, mut repr_ladder: impl Iterator<Item = TypeTerm>) -> Option<Arc<RwLock<ReprTree>>> { - if let Some(first) = repr_ladder.next() { - let rt = rt.read().unwrap(); - repr_ladder.fold( - rt.descend_one(first), - |s, t| s?.descend(t)) - } else { - Some(rt.clone()) - } - } - - pub fn descend(rt: &Arc<RwLock<Self>>, dst_type: impl Into<TypeTerm>) -> Option<Arc<RwLock<ReprTree>>> { - let mut lnf = dst_type.into().get_lnf_vec(); - if lnf.len() > 0 { - if lnf[0] == rt.get_type() { - lnf.remove(0); - } - ReprTree::descend_ladder(rt, lnf.into_iter()) - } else { - Some(rt.clone()) - } - } - - pub fn ascend(rt: &Arc<RwLock<Self>>, type_term: impl Into<TypeTerm>) -> Arc<RwLock<ReprTree>> { - let mut n = Self::new(type_term); - n.insert_branch(rt.clone()); - Arc::new(RwLock::new(n)) - } - - //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> - - pub fn singleton_buffer<T: Clone + Send + Sync + 'static>(&mut self) -> Option<SingletonBuffer<T>> { - if let Some(leaf) = self.leaf.as_mut() { - leaf.as_singleton_buffer::<T>() - } else { - // create new singleton buffer - /* - // default value?? - let buf = SingletonBuffer::<T>::default(); - self.leaf = Some(ReprLeaf::from_singleton_buffer(buf.clone())); - Some(buf) - */ - None - } - } - - pub fn vec_buffer<T: Clone + Send + Sync + 'static>(&mut self) -> Option<VecBuffer<T>> { - if let Some(leaf) = self.leaf.as_mut() { - leaf.as_vec_buffer::<T>() - } else { - None - } - } - - //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> - - pub fn get_port<V: View + ?Sized + 'static>(&self) -> Option<OuterViewPort<V>> - where - V::Msg: Clone, - { - if let Some(leaf) = self.leaf.as_ref() { - leaf.get_port::<V>() - } else { - None - } - } - - pub fn get_view<V: View + ?Sized + 'static>(&self) -> Option<Arc<V>> - where - V::Msg: Clone, - { - self.get_port::<V>()? - .get_view() - } - - //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> - - pub fn view_singleton<T: 'static>(&self) -> OuterViewPort<dyn SingletonView<Item = T>> { - self.get_port::<dyn SingletonView<Item = T>>().expect("no singleton-view available") - } - - pub fn view_seq<T: 'static>(&self) -> OuterViewPort<dyn SequenceView<Item = T>> { - self.get_port::<dyn SequenceView<Item = T>>().expect("no sequence-view available") - } - - pub fn view_list<T: Clone + Send + Sync + 'static>(&self) -> OuterViewPort<dyn ListView<T>> { - self.get_port::<dyn ListView<T>>().expect("no list-view available") - } - - pub fn view_char(&self) -> OuterViewPort<dyn SingletonView<Item = char>> { - self.get_port::<dyn SingletonView<Item = char>>().expect("no char-view available") - } - - pub fn view_u8(&self) -> OuterViewPort<dyn SingletonView<Item = u8>> { - self.get_port::<dyn SingletonView<Item = u8>>().expect("no u8-view available") - } - - pub fn view_u64(&self) -> OuterViewPort<dyn SingletonView<Item = u64>> { - self.get_port::<dyn SingletonView<Item = u64>>().expect("no u64-view available") - } - - pub fn view_usize(&self) -> OuterViewPort<dyn SingletonView<Item = usize>> { - self.get_port::<dyn SingletonView<Item = usize>>().expect("no usize-view available") - } -} - - - //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> pub trait ReprTreeExt { diff --git a/lib-nested-core/src/repr_tree/node.rs b/lib-nested-core/src/repr_tree/node.rs new file mode 100644 index 0000000..89dadf0 --- /dev/null +++ b/lib-nested-core/src/repr_tree/node.rs @@ -0,0 +1,348 @@ + + +use { + r3vi::{ + view::{ + ViewPort, OuterViewPort, + AnyViewPort, AnyInnerViewPort, AnyOuterViewPort, + port::UpdateTask, + View, Observer, + singleton::*, + sequence::*, + list::* + }, + buffer::{singleton::*, vec::*} + }, + laddertypes::{TypeTerm}, + std::{ + collections::HashMap, + sync::{Arc, RwLock}, + any::Any + }, + super::{Context, ReprLeaf, ReprTreeExt} +}; + +//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + +#[derive(Clone)] +pub struct ReprTree { + halo: TypeTerm, + type_tag: TypeTerm, + branches: HashMap<TypeTerm, Arc<RwLock<ReprTree>>>, + leaf: Option< ReprLeaf > +} + +//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + +impl std::fmt::Debug for ReprTree { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, "| type: {:?}", self.type_tag)?; + + for (_k,x) in self.branches.iter() { + writeln!(f, "|--> child: {:?}", x)?; + } + writeln!(f, ""); + + Ok(()) + } +} + +//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + +impl ReprTree { + pub fn new(type_tag: impl Into<TypeTerm>) -> Self { + let type_tag = type_tag.into(); + + assert!(type_tag.is_flat()); + + ReprTree { + halo: TypeTerm::unit(), + type_tag: type_tag.clone(), + branches: HashMap::new(), + leaf: None + } + } + + pub fn new_arc(type_tag: impl Into<TypeTerm>) -> Arc<RwLock<Self>> { + Arc::new(RwLock::new(Self::new(type_tag))) + } + + pub fn get_type(&self) -> &TypeTerm { + &self.type_tag + } + + pub fn set_halo(&mut self, halo_type: impl Into<TypeTerm>) { + self.halo = halo_type.into(); + for (branch_type, branch) in self.branches.iter() { + branch.write().unwrap().set_halo( TypeTerm::Ladder(vec![ + self.halo.clone(), + self.type_tag.clone() + ]).normalize() + ); + } + } + + pub fn get_halo_type(&self) -> &TypeTerm { + &self.halo + } + + pub fn get_leaf_types(&self) -> Vec< TypeTerm > { + let mut leaf_types = Vec::new(); + if self.leaf.is_some() { + leaf_types.push( self.get_type().clone() ); + } + for (branch_type, branch) in self.branches.iter() { + for t in branch.read().unwrap().get_leaf_types() { + leaf_types.push(TypeTerm::Ladder(vec![ + self.get_type().clone(), + t + ]).normalize()) + } + } + leaf_types + } + + pub fn insert_branch(&mut self, repr: Arc<RwLock<ReprTree>>) { + let branch_type = repr.read().unwrap().get_type().clone(); + + assert!(branch_type.is_flat()); + + repr.write().unwrap().set_halo( TypeTerm::Ladder(vec![ + self.halo.clone(), + self.type_tag.clone() + ]).normalize() ); + + self.branches.insert(branch_type, repr.clone()); + } + + pub fn from_char(ctx: &Arc<RwLock<Context>>, c: char ) -> Arc<RwLock<Self>> { + ReprTree::from_singleton_buffer( + Context::parse(ctx, "Char"), + SingletonBuffer::new(c) + ) + } + + pub fn from_view<V>( type_tag: impl Into<TypeTerm>, view: OuterViewPort<V> ) -> Arc<RwLock<Self>> + where V: View + ?Sized + 'static, + V::Msg: Clone + { + let mut rt = ReprTree::new(type_tag); + rt.leaf = Some(ReprLeaf::from_view(view)); + Arc::new(RwLock::new(rt)) + } + + pub fn from_singleton_buffer<T>( type_tag: impl Into<TypeTerm>, buf: SingletonBuffer<T> ) -> Arc<RwLock<Self>> + where T: Clone + Send + Sync + 'static + { + let mut rt = ReprTree::new(type_tag); + rt.leaf = Some(ReprLeaf::from_singleton_buffer(buf)); + Arc::new(RwLock::new(rt)) + } + + pub fn from_vec_buffer<T>( type_tag: impl Into<TypeTerm>, buf: VecBuffer<T> ) -> Arc<RwLock<Self>> + where T: Clone + Send + Sync + 'static + { + let mut rt = ReprTree::new(type_tag); + rt.leaf = Some(ReprLeaf::from_vec_buffer(buf)); + Arc::new(RwLock::new(rt)) + } + + pub fn attach_to<V>( + &mut self, + src_port: OuterViewPort<V> + ) + where V: View + ?Sized + 'static, + V::Msg: Clone + { + if let Some(leaf) = self.leaf.as_mut() { + leaf.attach_to(src_port); + } else { + eprintln!("cant attach branch without leaf"); + } + } + + /// find, and if necessary, create corresponding path in repr-tree. + /// Attach src_port to input of that node + pub fn attach_leaf_to<V>( + &mut self, + mut type_ladder: impl Iterator<Item = TypeTerm>, + src_port: OuterViewPort<V> + ) + where V: View + ?Sized + 'static, + V::Msg: Clone + { + while let Some(rung_type) = type_ladder.next() { + if &rung_type != self.get_type() { + if let Some(next_repr) = self.branches.get(&rung_type) { + next_repr.write().unwrap().attach_leaf_to(type_ladder, src_port); + } else { + let mut next_repr = ReprTree::new(rung_type.clone()); + next_repr.attach_leaf_to(type_ladder, src_port); + self.insert_branch(Arc::new(RwLock::new(next_repr))); + } + return; + } + } + + if let Some(leaf) = self.leaf.as_mut() { + leaf.attach_to(src_port); + } else { + self.leaf = Some(ReprLeaf::from_view(src_port)); + } + } + + pub fn detach(&mut self, ctx: &Arc<RwLock<Context>>) { + if let Some(leaf) = self.leaf.as_mut() { + if self.type_tag == Context::parse(&ctx, "Char") { + leaf.detach::<dyn SingletonView<Item = char>>(); + } + if self.type_tag == Context::parse(&ctx, "<Vec Char>") { + leaf.detach_vec::<char>(); + } + if self.type_tag == Context::parse(&ctx, "<List Char>") { + leaf.detach::<dyn ListView<char>>(); + } + } + + for (t,b) in self.branches.iter_mut() { + b.write().unwrap().detach(&ctx); + } + } + + pub fn insert_leaf( + &mut self, + mut type_ladder: impl Iterator<Item = TypeTerm>, + leaf: ReprLeaf + ) { + while let Some(type_term) = type_ladder.next() { + if &type_term != self.get_type() { + if let Some(next_repr) = self.branches.get(&type_term) { + next_repr.write().unwrap().insert_leaf(type_ladder, leaf.clone()); + } else { + let mut next_repr = ReprTree::new(type_term.clone()); + next_repr.insert_leaf(type_ladder, leaf.clone()); + self.insert_branch(Arc::new(RwLock::new(next_repr))); + } + return; + } + } + + self.leaf = Some(leaf); + } + + //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + + pub fn descend_one(&self, dst_type: impl Into<TypeTerm>) -> Option<Arc<RwLock<ReprTree>>> { + let dst_type = dst_type.into(); + assert!( dst_type.is_flat() ); + self.branches.get(&dst_type).cloned() + } + + pub fn descend_ladder(rt: &Arc<RwLock<Self>>, mut repr_ladder: impl Iterator<Item = TypeTerm>) -> Option<Arc<RwLock<ReprTree>>> { + if let Some(first) = repr_ladder.next() { + let rt = rt.read().unwrap(); + repr_ladder.fold( + rt.descend_one(first), + |s, t| s?.descend(t)) + } else { + Some(rt.clone()) + } + } + + pub fn descend(rt: &Arc<RwLock<Self>>, dst_type: impl Into<TypeTerm>) -> Option<Arc<RwLock<ReprTree>>> { + let mut lnf = dst_type.into().get_lnf_vec(); + if lnf.len() > 0 { + if lnf[0] == rt.get_type() { + lnf.remove(0); + } + ReprTree::descend_ladder(rt, lnf.into_iter()) + } else { + Some(rt.clone()) + } + } + + pub fn ascend(rt: &Arc<RwLock<Self>>, type_term: impl Into<TypeTerm>) -> Arc<RwLock<ReprTree>> { + let mut n = Self::new(type_term); + n.insert_branch(rt.clone()); + Arc::new(RwLock::new(n)) + } + + //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + + pub fn singleton_buffer<T: Clone + Send + Sync + 'static>(&mut self) -> Option<SingletonBuffer<T>> { + if let Some(leaf) = self.leaf.as_mut() { + leaf.as_singleton_buffer::<T>() + } else { + // create new singleton buffer + /* + // default value?? + let buf = SingletonBuffer::<T>::default(); + self.leaf = Some(ReprLeaf::from_singleton_buffer(buf.clone())); + Some(buf) + */ + None + } + } + + pub fn vec_buffer<T: Clone + Send + Sync + 'static>(&mut self) -> Option<VecBuffer<T>> { + if let Some(leaf) = self.leaf.as_mut() { + leaf.as_vec_buffer::<T>() + } else { + None + } + } + + //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + + pub fn get_port<V: View + ?Sized + 'static>(&self) -> Option<OuterViewPort<V>> + where + V::Msg: Clone, + { + if let Some(leaf) = self.leaf.as_ref() { + leaf.get_port::<V>() + } else { + None + } + } + + pub fn get_view<V: View + ?Sized + 'static>(&self) -> Option<Arc<V>> + where + V::Msg: Clone, + { + self.get_port::<V>()? + .get_view() + } + + //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + + pub fn view_singleton<T: 'static>(&self) -> OuterViewPort<dyn SingletonView<Item = T>> { + self.get_port::<dyn SingletonView<Item = T>>().expect("no singleton-view available") + } + + pub fn view_seq<T: 'static>(&self) -> OuterViewPort<dyn SequenceView<Item = T>> { + self.get_port::<dyn SequenceView<Item = T>>().expect("no sequence-view available") + } + + pub fn view_list<T: Clone + Send + Sync + 'static>(&self) -> OuterViewPort<dyn ListView<T>> { + self.get_port::<dyn ListView<T>>().expect("no list-view available") + } + + pub fn view_char(&self) -> OuterViewPort<dyn SingletonView<Item = char>> { + self.get_port::<dyn SingletonView<Item = char>>().expect("no char-view available") + } + + pub fn view_u8(&self) -> OuterViewPort<dyn SingletonView<Item = u8>> { + self.get_port::<dyn SingletonView<Item = u8>>().expect("no u8-view available") + } + + pub fn view_u64(&self) -> OuterViewPort<dyn SingletonView<Item = u64>> { + self.get_port::<dyn SingletonView<Item = u64>>().expect("no u64-view available") + } + + pub fn view_usize(&self) -> OuterViewPort<dyn SingletonView<Item = usize>> { + self.get_port::<dyn SingletonView<Item = usize>>().expect("no usize-view available") + } +} + +//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> +