From 03dc9f113321f369fc0a115a21e7b31cd99339a2 Mon Sep 17 00:00:00 2001 From: Michael Sippel <micha@fragmental.art> Date: Sun, 10 Mar 2024 19:27:51 +0100 Subject: [PATCH] add ReprTreeExt trait for Arc<Rwlock<>> --- lib-nested-core/src/repr_tree/mod.rs | 52 ++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/lib-nested-core/src/repr_tree/mod.rs b/lib-nested-core/src/repr_tree/mod.rs index 3ea0c0c..4ce5391 100644 --- a/lib-nested-core/src/repr_tree/mod.rs +++ b/lib-nested-core/src/repr_tree/mod.rs @@ -38,6 +38,54 @@ impl std::fmt::Debug for ReprTree { } } +pub trait ReprTreeExt { + fn get_type(&self) -> TypeTerm; + + fn insert_leaf(&mut self, type_ladder: impl Iterator<Item = TypeTerm>, port: AnyOuterViewPort); + fn insert_branch(&mut self, repr: Arc<RwLock<ReprTree>>); + + fn descend(&self, target_type: impl Into<TypeTerm>) -> Option<Arc<RwLock<ReprTree>>>; + fn descend_ladder(&self, ladder: impl Iterator<Item = TypeTerm>) -> Option<Arc<RwLock<ReprTree>>>; + + fn view_char(&self) -> OuterViewPort<dyn SingletonView<Item = char>>; + fn view_u8(&self) -> OuterViewPort<dyn SingletonView<Item = u8>>; + fn view_u64(&self) -> OuterViewPort<dyn SingletonView<Item = u64>>; +} + +impl ReprTreeExt for Arc<RwLock<ReprTree>> { + fn get_type(&self) -> TypeTerm { + self.read().unwrap().get_type().clone() + } + + fn insert_leaf(&mut self, type_ladder: impl Iterator<Item = TypeTerm>, port: AnyOuterViewPort) { + self.write().unwrap().insert_leaf(type_ladder, port) + } + + fn insert_branch(&mut self, repr: Arc<RwLock<ReprTree>>) { + self.write().unwrap().insert_branch(repr) + } + + fn descend(&self, target_type: impl Into<TypeTerm>) -> Option<Arc<RwLock<ReprTree>>> { + self.read().unwrap().descend(target_type) + } + + fn descend_ladder(&self, ladder: impl Iterator<Item = TypeTerm>) -> Option<Arc<RwLock<ReprTree>>> { + ReprTree::descend_ladder(self, ladder) + } + + fn view_char(&self) -> OuterViewPort<dyn SingletonView<Item = char>> { + self.read().unwrap().view_char() + } + + fn view_u8(&self) -> OuterViewPort<dyn SingletonView<Item = u8>> { + self.read().unwrap().view_u8() + } + + fn view_u64(&self) -> OuterViewPort<dyn SingletonView<Item = u64>> { + self.read().unwrap().view_u64() + } +} + //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> impl ReprTree { @@ -108,6 +156,10 @@ impl ReprTree { 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") }