diff --git a/src/wide.rs b/src/wide.rs index 4992a5b..a468a0f 100644 --- a/src/wide.rs +++ b/src/wide.rs @@ -1,3 +1,6 @@ +use std::cell::RefCell; +use std::rc::Rc; +use std::rc::Weak; use std::{fmt::Display, str::FromStr}; use nom::{ @@ -22,10 +25,118 @@ pub struct Addresses<'a> { addresses: Vec>, } +pub struct TreeNode<'a> { + parent: Option>>>, + children: Vec>>>, + + token: Token<'a>, +} + impl<'a> Addresses<'a> { // fn to_compact_tokens(&self) -> impl Iterator> { // } + + fn from_tokens(mut tokens: Vec) -> Result { + // 123 and 456 a b c + + // First, flip the order + tokens.reverse(); + // c b a 456 and 123 + + // Next, build the tree + let mut depth = 0; + + // let mut root_node = Rc::new(RefCell::new(TreeNode { + // parent: None, + // children: vec![], + // })); + + let mut ret = vec![]; + let mut last_node = None; + + for token in tokens.into_iter() { + match token { + Token::Word(_) => { + // The number must be inserted at depth 3 only + if depth >= 3 { + panic!("{token:?} found at depth {depth}"); + } + + let parent = last_node.as_ref().map(|ln| Rc::downgrade(&ln)); + let children = vec![]; + + let new_node = Rc::new(RefCell::new(TreeNode { + parent, + children, + token, + })); + + if let Some(ln) = last_node.as_ref() { + // Now add the child + ln.borrow_mut().children.push(Rc::clone(&new_node)); + } else { + // This is the first node + ret.push(Rc::clone(&new_node)); + } + + depth += 1; + last_node = Some(new_node); + } + Token::Number(_) => { + // The number must be inserted at depth 3 only + if depth != 3 { + panic!("{token:?} found at depth {depth}"); + } + + let parent = last_node.as_ref().map(|ln| Rc::downgrade(&ln)); + let children = vec![]; + + let new_node = Rc::new(RefCell::new(TreeNode { + parent, + children, + token, + })); + + if let Some(ln) = last_node.as_ref() { + // Now add the child + ln.borrow_mut().children.push(Rc::clone(&new_node)); + } else { + // This is the first node + ret.push(Rc::clone(&new_node)); + } + + depth += 1; + last_node = Some(new_node); + } + Token::WideSeparator => { + // 123 and 999 a and 456 b c d + // Tree: + // d + // c + // a b + // 123 999 456 + // + // last creaed: 123 last_created_depth= depth=3 + // and + // last creaed: 999 last_created_depth=3 depth=3 + // last creaed: a last_created_depth=3 depth=2 + // and + // last_creaed: 456 last_created_depth=2 depth=3 + // last_creaed: b last_created_depth=3 depth=2 + + // d c b 456 and a 999 and 123 + // Tree: + // d Depth=0 + // c Depth=1 + // b Depth=2 + // 456 Depth=0 + } + } + } + + todo![] + } } impl<'a> From>> for Addresses<'a> {