From 8b0c892f05766b952c383e50e21b704c95bd6be8 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Sun, 10 Jul 2022 15:10:26 +0900 Subject: [PATCH] Refactor SwaybarArray::get_by_name* to use a map Also some other minor refactorings. --- src/main.rs | 12 ++++-------- src/swaybar_object.rs | 31 ++++++++++++++++++------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/main.rs b/src/main.rs index 912fc6b..6b839cd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -145,10 +145,8 @@ fn main() { if is_empty { let meminfo_obj = SwaybarObject::from_string("meminfo".to_owned(), meminfo_string); array.push_object(meminfo_obj); - } else { - if let Some(meminfo_obj) = array.get_by_name_mut("meminfo") { - meminfo_obj.update_as_generic(meminfo_string, None); - } + } else if let Some(meminfo_obj) = array.get_by_name_mut("meminfo") { + meminfo_obj.update_as_generic(meminfo_string, None); } } @@ -165,10 +163,8 @@ fn main() { if is_empty { let loadavg_obj = SwaybarObject::from_string("loadavg".to_owned(), loadavg_string); array.push_object(loadavg_obj); - } else { - if let Some(loadavg_obj) = array.get_by_name_mut("loadavg") { - loadavg_obj.update_as_generic(loadavg_string, None); - } + } else if let Some(loadavg_obj) = array.get_by_name_mut("loadavg") { + loadavg_obj.update_as_generic(loadavg_string, None); } } diff --git a/src/swaybar_object.rs b/src/swaybar_object.rs index d0ac887..131aae1 100644 --- a/src/swaybar_object.rs +++ b/src/swaybar_object.rs @@ -1,4 +1,5 @@ use std::{ + collections::HashMap, fmt::Display, ops::{Index, IndexMut}, }; @@ -54,9 +55,10 @@ pub struct SwaybarObject { pub markup: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Debug)] pub struct SwaybarArray { objects: Vec, + objects_idx_map: HashMap, } impl SwaybarHeader { @@ -181,11 +183,13 @@ impl SwaybarArray { pub fn new() -> Self { Self { objects: Vec::new(), + objects_idx_map: HashMap::new(), } } pub fn push_object(&mut self, object: SwaybarObject) { self.objects.push(object); + self.refresh_map(); } pub fn is_empty(&self) -> bool { @@ -194,12 +198,8 @@ impl SwaybarArray { // TODO this is linear, and it probably is possible to improve this pub fn get_by_name(&self, name: &str) -> Option<&SwaybarObject> { - for object in &self.objects { - if let Some(object_name) = object.get_name() { - if object_name == name { - return Some(object); - } - } + if let Some(idx) = self.objects_idx_map.get(name) { + return Some(&self.objects[*idx]); } None @@ -207,16 +207,21 @@ impl SwaybarArray { // TODO this is linear, and it probably is possible to improve this pub fn get_by_name_mut(&mut self, name: &str) -> Option<&mut SwaybarObject> { - for object in &mut self.objects { - if let Some(object_name) = object.get_name() { - if object_name == name { - return Some(object); - } - } + if let Some(idx) = self.objects_idx_map.get(name) { + return Some(&mut self.objects[*idx]); } None } + + fn refresh_map(&mut self) { + self.objects_idx_map.clear(); + for (idx, object) in self.objects.iter().enumerate() { + if let Some(name) = object.get_name() { + self.objects_idx_map.insert(name.to_owned(), idx); + } + } + } } impl Index for SwaybarArray { -- 2.49.0