diff options
author | rabite <rabite@posteo.de> | 2019-12-20 22:07:38 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-12-20 22:07:38 +0100 |
commit | 03693f96d0265f665ec00b5bb204cb727d7b137a (patch) | |
tree | 0e9e7f01e7eaff33f764c76a3a09c0fc84f02d60 /src/files.rs | |
parent | 0525f37c6964e43cc82dd548bd7ac460c7c84601 (diff) |
improved Files interface by returning Iterator instead of Vec<&File>
Diffstat (limited to 'src/files.rs')
-rw-r--r-- | src/files.rs | 59 |
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() } } |