From c6d3d545afd542015a44341b3b3e13be79c941f9 Mon Sep 17 00:00:00 2001 From: sxyazi Date: Sat, 28 Jun 2025 17:55:40 +0800 Subject: [PATCH] Avoid unnecessary allocation --- yazi-core/src/mgr/commands/open.rs | 54 ++++++++++++++---------------- yazi-core/src/mgr/commands/quit.rs | 7 ++-- yazi-core/src/tab/tab.rs | 2 +- 3 files changed, 32 insertions(+), 31 deletions(-) diff --git a/yazi-core/src/mgr/commands/open.rs b/yazi-core/src/mgr/commands/open.rs index 32851345..b48f2549 100644 --- a/yazi-core/src/mgr/commands/open.rs +++ b/yazi-core/src/mgr/commands/open.rs @@ -1,4 +1,4 @@ -use std::borrow::Cow; +use std::{borrow::Cow, iter}; use tracing::error; use yazi_config::{YAZI, popup::PickCfg}; @@ -31,26 +31,29 @@ impl Mgr { return; }; - let selected = if opt.hovered { vec![&hovered] } else { self.selected_or_hovered().collect() }; - if Self::quit_with_selected(opt, &selected) { + let mut selected = + if opt.hovered { Box::new(iter::once(&hovered)) } else { self.selected_or_hovered() }; + if Self::quit_with_selected(opt, &mut selected) { return; } + let mut todo = vec![]; + let targets: Vec<_> = selected + .cloned() + .enumerate() + .map(|(i, u)| { + if self.mimetype.contains(&u) { + (u, "") + } else if self.guess_folder(&u) { + (u, MIME_DIR) + } else { + todo.push(i); + (u, "") + } + }) + .collect(); + let cwd = self.cwd().clone(); - let (mut targets, mut todo) = - (selected.into_iter().map(|u| (u.clone(), "")).collect::>(), vec![]); - - for (i, (u, mime)) in targets.iter_mut().enumerate() { - if self.mimetype.contains(u) { - continue; - } - if self.guess_folder(u) { - *mime = MIME_DIR; - } else { - todo.push(i); - } - } - if todo.is_empty() { return self .open_do(OpenDoOpt { cwd, hovered, targets, interactive: opt.interactive }, tasks); @@ -58,12 +61,9 @@ impl Mgr { tokio::spawn(async move { let mut files = Vec::with_capacity(todo.len()); - for i in todo.into_iter().rev() { + for i in todo { if let Ok(f) = File::new(targets[i].0.clone()).await { - targets[i] = (f.url_owned(), ""); files.push(f); - } else { - targets.remove(i); } } @@ -79,14 +79,12 @@ impl Mgr { #[yazi_codegen::command] pub fn open_do(&mut self, opt: OpenDoOpt, tasks: &Tasks) { - let targets: Vec<_> = opt - .targets - .into_iter() - .filter_map(|(u, m)| { - Some(m).filter(|m| !m.is_empty()).or_else(|| self.mimetype.by_url(&u)).map(|m| (u, m)) - }) - .collect(); + let mut targets = opt.targets; + targets.iter_mut().filter(|(_, m)| m.is_empty()).for_each(|(u, m)| { + *m = self.mimetype.by_url(u).unwrap_or_default(); + }); + targets.retain(|(_, m)| !m.is_empty()); if targets.is_empty() { return; } else if !opt.interactive { diff --git a/yazi-core/src/mgr/commands/quit.rs b/yazi-core/src/mgr/commands/quit.rs index 52457c78..58234303 100644 --- a/yazi-core/src/mgr/commands/quit.rs +++ b/yazi-core/src/mgr/commands/quit.rs @@ -74,12 +74,15 @@ impl Mgr { }); } - pub(super) fn quit_with_selected(opt: super::open::Opt, selected: &[&Url]) -> bool { + pub(super) fn quit_with_selected<'a, I>(opt: super::open::Opt, selected: I) -> bool + where + I: Iterator, + { if opt.interactive || ARGS.chooser_file.is_none() { return false; } - let paths = selected.iter().fold(OsString::new(), |mut s, &u| { + let paths = selected.fold(OsString::new(), |mut s, u| { s.push(u.as_os_str()); s.push("\n"); s diff --git a/yazi-core/src/tab/tab.rs b/yazi-core/src/tab/tab.rs index 88983d7f..63ea995b 100644 --- a/yazi-core/src/tab/tab.rs +++ b/yazi-core/src/tab/tab.rs @@ -87,7 +87,7 @@ impl Tab { pub fn selected_or_hovered(&self) -> Box + '_> { if self.selected.is_empty() { - Box::new(self.hovered().map(|h| vec![&h.url]).unwrap_or_default().into_iter()) + Box::new(self.hovered().map(|h| &h.url).into_iter()) } else { Box::new(self.selected.keys()) }