ReprTree: add halo type
This commit is contained in:
parent
fdecc29e80
commit
d02f33ee17
2 changed files with 63 additions and 16 deletions
|
@ -44,6 +44,7 @@ pub struct ReprLeaf {
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ReprTree {
|
pub struct ReprTree {
|
||||||
|
halo: TypeTerm,
|
||||||
type_tag: TypeTerm,
|
type_tag: TypeTerm,
|
||||||
branches: HashMap<TypeTerm, Arc<RwLock<ReprTree>>>,
|
branches: HashMap<TypeTerm, Arc<RwLock<ReprTree>>>,
|
||||||
leaf: Option< ReprLeaf >
|
leaf: Option< ReprLeaf >
|
||||||
|
@ -207,8 +208,13 @@ impl ReprLeaf {
|
||||||
|
|
||||||
impl ReprTree {
|
impl ReprTree {
|
||||||
pub fn new(type_tag: impl Into<TypeTerm>) -> Self {
|
pub fn new(type_tag: impl Into<TypeTerm>) -> Self {
|
||||||
|
let type_tag = type_tag.into();
|
||||||
|
|
||||||
|
assert!(type_tag.is_flat());
|
||||||
|
|
||||||
ReprTree {
|
ReprTree {
|
||||||
type_tag: type_tag.into(),
|
halo: TypeTerm::unit(),
|
||||||
|
type_tag: type_tag.clone(),
|
||||||
branches: HashMap::new(),
|
branches: HashMap::new(),
|
||||||
leaf: None
|
leaf: None
|
||||||
}
|
}
|
||||||
|
@ -222,8 +228,31 @@ impl ReprTree {
|
||||||
&self.type_tag
|
&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 insert_branch(&mut self, repr: Arc<RwLock<ReprTree>>) {
|
pub fn insert_branch(&mut self, repr: Arc<RwLock<ReprTree>>) {
|
||||||
self.branches.insert(repr.clone().read().unwrap().type_tag.clone(), repr.clone());
|
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>> {
|
pub fn from_char(ctx: &Arc<RwLock<Context>>, c: char ) -> Arc<RwLock<Self>> {
|
||||||
|
@ -250,7 +279,6 @@ impl ReprTree {
|
||||||
Arc::new(RwLock::new(rt))
|
Arc::new(RwLock::new(rt))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub fn from_vec_buffer<T>( type_tag: impl Into<TypeTerm>, buf: VecBuffer<T> ) -> Arc<RwLock<Self>>
|
pub fn from_vec_buffer<T>( type_tag: impl Into<TypeTerm>, buf: VecBuffer<T> ) -> Arc<RwLock<Self>>
|
||||||
where T: Clone + Send + Sync + 'static
|
where T: Clone + Send + Sync + 'static
|
||||||
{
|
{
|
||||||
|
@ -437,21 +465,16 @@ impl ReprTreeExt for Arc<RwLock<ReprTree>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_branch(&mut self, rung: impl Into<TypeTerm>) {
|
fn create_branch(&mut self, rung: impl Into<TypeTerm>) {
|
||||||
let lnf = rung.into().get_lnf_vec();
|
let mut lnf = rung.into().get_lnf_vec().into_iter();
|
||||||
eprintln!("lnf ={:?}",lnf);
|
if let Some(rung) = lnf.next() {
|
||||||
|
let mut parent = ReprTree::new_arc( rung );
|
||||||
|
self.insert_branch( parent.clone() );
|
||||||
|
|
||||||
let mut child = None;
|
for rung in lnf {
|
||||||
for rung in lnf.iter().rev() {
|
let r = ReprTree::new_arc( rung );
|
||||||
eprintln!("create {:?}",rung);
|
parent.insert_branch(r.clone());
|
||||||
let mut parent = ReprTree::new_arc( rung.clone() );
|
parent = r;
|
||||||
if let Some(c) = child.take() {
|
|
||||||
parent.insert_branch( c );
|
|
||||||
}
|
}
|
||||||
child = Some(parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(child) = child.take() {
|
|
||||||
self.insert_branch(child);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,30 @@ use {
|
||||||
std::sync::{Arc, RwLock}
|
std::sync::{Arc, RwLock}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn halo_type() {
|
||||||
|
let ctx = Arc::new(RwLock::new(Context::new()));
|
||||||
|
|
||||||
|
let mut rt1 = ReprTree::new_arc(Context::parse(&ctx, "ℕ"));
|
||||||
|
let mut rt2 = ReprTree::new_arc(Context::parse(&ctx, "<PosInt 10 BigEndian>"));
|
||||||
|
rt1.insert_branch( rt2.clone() );
|
||||||
|
assert_eq!( rt2.read().unwrap().get_halo_type(), &Context::parse(&ctx, "ℕ") );
|
||||||
|
|
||||||
|
let mut rt3 = ReprTree::new_arc(Context::parse(&ctx, "<Seq <Digit 10>>"));
|
||||||
|
rt2.insert_branch( rt3.clone() );
|
||||||
|
assert_eq!( rt3.read().unwrap().get_halo_type(), &Context::parse(&ctx, "ℕ~<PosInt 10 BigEndian>") );
|
||||||
|
|
||||||
|
let rt4 = ReprTree::new_arc(Context::parse(&ctx, "<List <Digit 10>>"));
|
||||||
|
rt3.insert_branch( rt4.clone() );
|
||||||
|
assert_eq!( rt4.read().unwrap().get_halo_type(), &Context::parse(&ctx, "ℕ~<PosInt 10 BigEndian>~<Seq <Digit 10>>") );
|
||||||
|
|
||||||
|
|
||||||
|
let mut r = ReprTree::new_arc(Context::parse(&ctx, "ℕ"));
|
||||||
|
r.create_branch(Context::parse(&ctx, "<PosInt 10 BigEndian>~<Seq <Digit 10>>"));
|
||||||
|
assert_eq!( r.descend(Context::parse(&ctx, "<PosInt 10 BigEndian>")).unwrap().read().unwrap().get_halo_type(), &Context::parse(&ctx, "ℕ") );
|
||||||
|
assert_eq!( r.descend(Context::parse(&ctx, "<PosInt 10 BigEndian>~<Seq <Digit 10>>")).unwrap().read().unwrap().get_halo_type(), &Context::parse(&ctx, "ℕ~<PosInt 10 BigEndian>") );
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn char_view() {
|
fn char_view() {
|
||||||
let ctx = Arc::new(RwLock::new(Context::new()));
|
let ctx = Arc::new(RwLock::new(Context::new()));
|
||||||
|
|
Loading…
Reference in a new issue