Simplify the code

This commit is contained in:
sxyazi 2023-08-12 22:58:18 +08:00
parent 25a0a5be78
commit 08b864a27c
No known key found for this signature in database
5 changed files with 37 additions and 59 deletions

View file

@ -129,7 +129,7 @@ impl Executor {
by: SortBy::try_from(exec.args.get(0).cloned().unwrap_or_default()) by: SortBy::try_from(exec.args.get(0).cloned().unwrap_or_default())
.unwrap_or_default(), .unwrap_or_default(),
reverse: exec.named.contains_key("reverse"), reverse: exec.named.contains_key("reverse"),
dir_first: exec.named.contains_key("dir_first") dir_first: exec.named.contains_key("dir_first"),
}); });
cx.tasks.precache_size(&cx.manager.current().files); cx.tasks.precache_size(&cx.manager.current().files);
b b

View file

@ -9,16 +9,16 @@
- `"modified"`: Sort by last modified time - `"modified"`: Sort by last modified time
- `"size"`: Sort by file size - `"size"`: Sort by file size
- sort_dir_first: Display files in reverse order
- `true`: Directory at first
- `false`: Sort According to `sort_by` only
- sort_reverse: Display files in reverse order - sort_reverse: Display files in reverse order
- `true`: Reverse order - `true`: Reverse order
- `false`: Normal order - `false`: Normal order
- sort_dir_first: Display directories first
- `true`: Directories first
- `false`: Respects `sort_by` and `sort_reverse` only
- show_hidden: Show hidden files - show_hidden: Show hidden files
- `true`: Show - `true`: Show

View file

@ -1,7 +1,7 @@
[manager] [manager]
sort_by = "modified" sort_by = "modified"
sort_dir_first = true
sort_reverse = true sort_reverse = true
sort_dir_first = true
show_hidden = false show_hidden = false
[preview] [preview]

View file

@ -1,4 +1,4 @@
use std::{collections::BTreeMap, ops::{Deref, DerefMut}, path::{Path, PathBuf}}; use std::{cmp::Ordering, collections::BTreeMap, ops::{Deref, DerefMut}, path::{Path, PathBuf}};
use anyhow::Result; use anyhow::Result;
use config::{manager::SortBy, MANAGER}; use config::{manager::SortBy, MANAGER};
@ -116,65 +116,43 @@ impl Files {
return false; return false;
} }
fn cmp_dir(a: &File, b: &File, dir_first: bool) -> Option<std::cmp::Ordering> { #[inline]
if !dir_first { #[allow(clippy::collapsible_else_if)]
return None; fn cmp<T: Ord>(a: T, b: T, reverse: bool, promote: Ordering) -> Ordering {
if promote != Ordering::Equal {
promote
} else {
if reverse { b.cmp(&a) } else { a.cmp(&b) }
} }
if a.meta.is_dir() && !b.meta.is_dir() {
return Some(std::cmp::Ordering::Less);
} else if !a.meta.is_dir() && b.meta.is_dir() {
return Some(std::cmp::Ordering::Greater);
}
None
} }
fn cmp<T>( #[inline]
a: &File, fn promote(a: &File, b: &File, dir_first: bool) -> Ordering {
b: &File, if dir_first { b.meta.is_dir().cmp(&a.meta.is_dir()) } else { Ordering::Equal }
dir_first: bool,
reverse: bool,
inner_cmp: T,
) -> std::cmp::Ordering
where
T: Fn(&File, &File) -> std::cmp::Ordering,
{
let res = match cmp_dir(a, b, dir_first) {
Some(expr) => expr,
None => inner_cmp(a, b),
};
if reverse { res.reverse() } else { res }
} }
let dir_first = self.sort.dir_first;
let reverse = self.sort.reverse; let reverse = self.sort.reverse;
let dir_first = self.sort.dir_first;
match self.sort.by { match self.sort.by {
SortBy::Alphabetical => self.items.sort_by(|_, a, _, b| { SortBy::Alphabetical => {
cmp(a, b, dir_first, reverse, |a: &File, b: &File| a.path.cmp(&b.path)) self.items.sort_by(|_, a, _, b| cmp(&a.path, &b.path, reverse, promote(a, b, dir_first)))
}),
SortBy::Created => self.items.sort_by(|_, a, _, b| {
cmp(a, b, dir_first, reverse, |a: &File, b: &File| {
if let (Ok(a), Ok(b)) = (a.meta.created(), b.meta.created()) {
return (&a).cmp(&b);
} }
std::cmp::Ordering::Equal SortBy::Created => self.items.sort_by(|_, a, _, b| {
}) if let (Ok(aa), Ok(bb)) = (a.meta.created(), b.meta.created()) {
return cmp(aa, bb, reverse, promote(a, b, dir_first));
}
Ordering::Equal
}), }),
SortBy::Modified => self.items.sort_by(|_, a, _, b| { SortBy::Modified => self.items.sort_by(|_, a, _, b| {
cmp(a, b, dir_first, reverse, |a: &File, b: &File| { if let (Ok(aa), Ok(bb)) = (a.meta.modified(), b.meta.modified()) {
if let (Ok(a), Ok(b)) = (a.meta.modified(), b.meta.modified()) { return cmp(aa, bb, reverse, promote(a, b, dir_first));
return (&a).cmp(&b);
} }
std::cmp::Ordering::Equal Ordering::Equal
})
}), }),
SortBy::Size => self.items.sort_by(|_, a, _, b| { SortBy::Size => self.items.sort_by(|_, a, _, b| {
cmp(a, b, dir_first, reverse, |a: &File, b: &File| { cmp(a.length.unwrap_or(0), b.length.unwrap_or(0), reverse, promote(a, b, dir_first))
(a.length.unwrap_or(0)).cmp(&b.length.unwrap_or(0))
})
}), }),
} }
true true
} }
} }