mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
Avoid unnecessary allocation
This commit is contained in:
parent
be13fffc02
commit
c6d3d545af
3 changed files with 32 additions and 31 deletions
|
|
@ -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<_>>(), 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 {
|
||||
|
|
|
|||
|
|
@ -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<Item = &'a Url>,
|
||||
{
|
||||
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
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ impl Tab {
|
|||
|
||||
pub fn selected_or_hovered(&self) -> Box<dyn Iterator<Item = &Url> + '_> {
|
||||
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())
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue