Skip to content

Instantly share code, notes, and snippets.

@kprav33n
Last active December 7, 2022 23:24
Show Gist options
  • Save kprav33n/e3f7974576279b3893573f272159dca9 to your computer and use it in GitHub Desktop.
Save kprav33n/e3f7974576279b3893573f272159dca9 to your computer and use it in GitHub Desktop.
use std::cell::{RefCell, RefMut};
use std::collections::HashMap;
use std::rc::{Rc, Weak};
#[derive(Debug)]
struct File {
name: String,
size: usize,
}
#[derive(Debug)]
struct Directory {
name: String,
parent: Option<Weak<RefCell<Directory>>>,
sub_directories: HashMap<String, Rc<RefCell<Directory>>>,
files: HashMap<String, Rc<File>>,
}
impl Directory {
fn mkdir(&mut self, name: &str) {
let dir = Directory {
name: name.to_string(),
parent: Some(/* How to initialize this? */),
sub_directories: HashMap::new(),
files: HashMap::new(),
};
self.sub_directories
.insert(name.to_string(), Rc::new(RefCell::new(dir)));
}
fn mkfile(&mut self, name: &str, size: usize) {
let file = File {
name: name.to_string(),
size,
};
self.files.insert(name.to_string(), Rc::new(file));
}
fn cd(&mut self, name: &str) -> RefMut<Directory> {
if name == ".." {
// TODO: Return parent directory.
}
return self.sub_directories[&name.to_string()].borrow_mut();
}
fn size(&self) -> usize {
let mut result = 0;
for (_, f) in &self.files {
result += f.size;
}
for (_, d) in &self.sub_directories {
result += d.borrow().size();
}
result
}
fn all_sizes(&self) -> Vec<usize> {
let mut result = Vec::new();
result.push(self.size());
for (_, d) in &self.sub_directories {
result.extend(d.borrow().all_sizes());
}
result
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment