From ddd8cfb38827363666e5b6bff729cb886df56fc3 Mon Sep 17 00:00:00 2001 From: Onielfa Date: Sat, 15 Feb 2020 02:38:25 +0100 Subject: [PATCH] perf: refactor git status to use HashMap for counts (#938) --- src/modules/git_status.rs | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/modules/git_status.rs b/src/modules/git_status.rs index 4a558faf..0778bbce 100644 --- a/src/modules/git_status.rs +++ b/src/modules/git_status.rs @@ -5,6 +5,7 @@ use super::{Context, Module, RootModuleConfig}; use crate::config::SegmentConfig; use crate::configs::git_status::{CountConfig, GitStatusConfig}; use std::borrow::BorrowMut; +use std::collections::HashMap; /// Creates a module with the Git branch in the current directory /// @@ -210,19 +211,41 @@ fn get_repo_status(repository: &mut Repository) -> Result) -> HashMap<&'static str, usize> { + let mut predicates: HashMap<&'static str, fn(git2::Status) -> bool> = HashMap::new(); + predicates.insert("conflicted", is_conflicted); + predicates.insert("deleted", is_deleted); + predicates.insert("renamed", is_renamed); + predicates.insert("modified", is_modified); + predicates.insert("staged", is_staged); + predicates.insert("untracked", is_untracked); + + statuses.iter().fold(HashMap::new(), |mut map, status| { + for (key, predicate) in predicates.iter() { + if predicate(*status) { + let entry = map.entry(key).or_insert(0); + *entry += 1; + } + } + map + }) +} + fn is_conflicted(status: Status) -> bool { status.is_conflicted() }