From 824321c6604e8c487c51f1e7eeb0141a7b8374ee Mon Sep 17 00:00:00 2001 From: Gabe Venberg Date: Sun, 12 Nov 2023 18:27:48 -0600 Subject: [PATCH] try number who knows for day07. --- src/day07/file_tree.rs | 152 ++++++++++++++--------------------------- src/day07/parser.rs | 4 +- src/day07/solve.rs | 2 +- src/template/solve.rs | 2 +- 4 files changed, 55 insertions(+), 105 deletions(-) diff --git a/src/day07/file_tree.rs b/src/day07/file_tree.rs index 19e558a..140a478 100644 --- a/src/day07/file_tree.rs +++ b/src/day07/file_tree.rs @@ -1,82 +1,20 @@ use std::{ cell::RefCell, - collections::{hash_map, HashMap}, ops::Deref, rc::{Rc, Weak}, }; -pub type WeakDirRef = Weak>; +use thiserror::Error; -pub trait FileLike { - fn get_parent(&self) -> Option; - fn get_name(&self) -> String; +#[derive(Error, Debug)] +pub enum FileTreeError { + #[error("Directory operation on file")] + IsFile, + #[error("File operation on directory")] + IsDir, } -#[derive(Debug)] -pub struct DirRef(Rc>); - -impl Deref for DirRef { - type Target = Rc>; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl DirRef { - pub fn add_child_node(&mut self, mut node: Node) -> NodeRef { - node.change_parent(self); - let node_ref = NodeRef(Rc::new(RefCell::new(node))); - Rc::clone(self) - .borrow_mut() - .children - .push(NodeRef(Rc::clone(&node_ref))); - node_ref - } - - pub fn add_child_dir(&mut self, mut dir: Dir) -> DirRef { - dir.parent = Some(Rc::downgrade(self)); - let dir_ref = DirRef(Rc::new(RefCell::new(dir))); - Rc::clone(self).borrow_mut().children.push( - Node::Dir(()) - ); - todo!() - } -} - -#[derive(Debug)] -pub struct Dir { - name: String, - parent: Option, - children: Vec, -} - -impl Dir { - pub fn get_total_size(&self) -> usize { - self.children - .iter() - .map(|n| -> usize { - match Rc::clone(n).borrow().deref() { - Node::Dir(d) => d.get_total_size(), - Node::File(f) => f.size, - } - }) - .sum() - } - - pub fn get_children(&self) -> impl Iterator + '_ { - self.children.iter().map(|n| NodeRef(Rc::clone(n))) - } -} - -impl FileLike for Dir { - fn get_parent(&self) -> Option { - Some(DirRef(self.parent.as_ref()?.upgrade()?)) - } - fn get_name(&self) -> String { - self.name.clone() - } -} +type WeakNodeRef = Weak>; #[derive(Debug)] pub struct NodeRef(Rc>); @@ -89,48 +27,60 @@ impl Deref for NodeRef { } } +impl From>> for NodeRef { + fn from(value: Rc>) -> Self { + NodeRef(value) + } +} + +impl From for Rc> { + fn from(value: NodeRef) -> Self { + value.0 + } +} + #[derive(Debug)] -pub enum Node { - Dir(Dir), - File(File), +pub struct Node { + pub name: String, + parent: Option, + contents: Contents, } impl Node { - fn change_parent(&mut self, new_parent: &DirRef) { - match self { - Node::Dir(d) => d.parent = Some(Rc::downgrade(new_parent)), - Node::File(f) => f.parent = Rc::downgrade(new_parent), + fn set_parent(&mut self, newparent: &NodeRef) { + self.parent = Some(Rc::downgrade(newparent)); + } + pub fn get_parent(&self) -> Option { + match &self.parent{ + Some(w) => Some(NodeRef(w.clone().upgrade()?)), + None => None, } } -} - -impl FileLike for Node { - fn get_parent(&self) -> Option { - match self { - Node::Dir(d) => d.get_parent(), - Node::File(f) => f.get_parent(), + pub fn get_size(&self) -> Result { + match self.contents { + Contents::Size(s) => Ok(s), + Contents::Children(_) => Err(FileTreeError::IsDir), } } - fn get_name(&self) -> String { - match self { - Node::Dir(d) => d.get_name(), - Node::File(f) => f.get_name(), + pub fn set_size(&mut self, size: usize) -> Result<(), FileTreeError> { + match self.contents { + Contents::Size(ref mut s) => { + *s = size; + Ok(()) + } + Contents::Children(_) => Err(FileTreeError::IsDir), + } + } + pub fn get_children(&self) -> Result + '_, FileTreeError> { + match &self.contents { + Contents::Size(_) => Err(FileTreeError::IsFile), + Contents::Children(c) => Ok(c.iter().map(|n| NodeRef(Rc::clone(n)))), } } } #[derive(Debug)] -pub struct File { - name: String, - parent: WeakDirRef, - pub size: usize, -} - -impl FileLike for File { - fn get_parent(&self) -> Option { - Some(DirRef(self.parent.upgrade()?)) - } - fn get_name(&self) -> String { - self.name.clone() - } +pub enum Contents { + Size(usize), + Children(Vec), } diff --git a/src/day07/parser.rs b/src/day07/parser.rs index f26b534..f9bf84c 100644 --- a/src/day07/parser.rs +++ b/src/day07/parser.rs @@ -73,11 +73,11 @@ fn parse_ls(lines: &mut std::iter::Peekable>) -> Vec Dir { +pub fn parse(input: &str) -> Node { unimplemented!() } -pub fn commands_to_tree(input: Vec) -> Dir { +pub fn commands_to_tree(input: Vec) -> Node { unimplemented!() } diff --git a/src/day07/solve.rs b/src/day07/solve.rs index bc1accb..893bc3d 100644 --- a/src/day07/solve.rs +++ b/src/day07/solve.rs @@ -1,4 +1,4 @@ -#![allow(unused)] +#![allow(dead_code)] mod part1; mod part2; mod parser; diff --git a/src/template/solve.rs b/src/template/solve.rs index 6b8c460..82e1e46 100644 --- a/src/template/solve.rs +++ b/src/template/solve.rs @@ -1,4 +1,4 @@ -#![allow(unused)] +#![allow(dead_code)] mod part1; mod part2; mod utilities;