summaryrefslogtreecommitdiffstats
path: root/src/files.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-12-20 22:07:38 +0100
committerrabite <rabite@posteo.de>2019-12-20 22:07:38 +0100
commit03693f96d0265f665ec00b5bb204cb727d7b137a (patch)
tree0e9e7f01e7eaff33f764c76a3a09c0fc84f02d60 /src/files.rs
parent0525f37c6964e43cc82dd548bd7ac460c7c84601 (diff)
improved Files interface by returning Iterator instead of Vec<&File>
Diffstat (limited to 'src/files.rs')
-rw-r--r--src/files.rs59
1 files changed, 30 insertions, 29 deletions
diff --git a/src/files.rs b/src/files.rs
index fa774c5..d8558af 100644
--- a/src/files.rs
+++ b/src/files.rs
@@ -238,48 +238,54 @@ impl Files {
}
pub fn get_file_mut(&mut self, index: usize) -> Option<&mut File> {
+ self.iter_files_mut()
+ .nth(index)
+ }
+
+ pub fn iter_files(&self) -> impl Iterator<Item=&File> {
let filter = self.filter.clone();
let filter_selected = self.filter_selected;
let show_hidden = self.show_hidden;
- let file = self.files
- .iter_mut()
- .filter(|f|
+ self.files
+ .iter()
+ .filter(move |f|
f.kind == Kind::Placeholder ||
!(filter.is_some() &&
!f.name.contains(filter.as_ref().unwrap())) &&
(!filter_selected || f.selected))
- .filter(|f| !(!show_hidden && f.name.starts_with(".")))
- .nth(index);
- file
+ .filter(move |f| !(!show_hidden && f.name.starts_with(".")))
}
- pub fn get_files(&self) -> Vec<&File> {
+ pub fn iter_files_mut(&mut self) -> impl Iterator<Item=&mut File> {
+ let filter = self.filter.clone();
+ let filter_selected = self.filter_selected;
+ let show_hidden = self.show_hidden;
+
self.files
- .iter()
- .filter(|f|
+ .iter_mut()
+ .filter(move |f|
f.kind == Kind::Placeholder ||
- !(self.filter.is_some() &&
- !f.name.contains(self.filter.as_ref().unwrap())) &&
- (!self.filter_selected || f.selected))
- .filter(|f| !(!self.show_hidden && f.name.starts_with(".")))
- .collect()
+ !(filter.is_some() &&
+ !f.name.contains(filter.as_ref().unwrap())) &&
+ (!filter_selected || f.selected))
+ .filter(move |f| !(!show_hidden && f.name.starts_with(".")))
}
- pub fn get_files_mut(&mut self) -> Vec<&mut File> {
- let filter = self.filter.clone();
+ #[allow(trivial_bounds)]
+ pub fn into_iter_files(self) -> impl Iterator<Item=File> {
+ let filter = self.filter;
let filter_selected = self.filter_selected;
let show_hidden = self.show_hidden;
self.files
- .iter_mut()
- .filter(|f|
+ .into_iter()
+ .filter(move |f|
f.kind == Kind::Placeholder ||
!(filter.is_some() &&
!f.name.contains(filter.as_ref().unwrap())) &&
(!filter_selected || f.selected))
- .filter(|f| !(!show_hidden && f.name.starts_with(".")))
- .collect()
+ .filter(move |f| !(!show_hidden && f.name.starts_with(".")))
}
pub fn sort(&mut self) {
@@ -454,10 +460,8 @@ impl Files {
}
pub fn find_file_with_name(&self, name: &str) -> Option<&File> {
- self.get_files()
- .iter()
+ self.iter_files()
.find(|f| f.name.to_lowercase().contains(name))
- .cloned()
}
pub fn find_file_with_path(&mut self, path: &Path) -> Option<&mut File> {
@@ -543,15 +547,12 @@ impl Files {
}
pub fn len(&self) -> usize {
- self.get_files().len()
+ self.iter_files().count()
}
- pub fn get_selected(&self) -> Vec<&File> {
- self.get_files()
- .iter()
+ pub fn get_selected(&self) -> impl Iterator<Item=&File> {
+ self.iter_files()
.filter(|f| f.is_selected())
- .map(|f| *f)
- .collect()
}
}