Browse Source

Refactor Dictionary creation

Blallo 4 years ago
parent
commit
ac99a172cc
1 changed files with 28 additions and 17 deletions
  1. 28 17
      src/main.rs

+ 28 - 17
src/main.rs

@@ -17,19 +17,31 @@ struct Dictionary {
 }
 
 impl Dictionary {
-    fn load_from_iterable(&mut self, lines: impl Iterator<Item = Result<String, Error>>) {
-        let mut it = lines;
+    fn words_from_iterable(
+        lines: impl Iterator<Item = Result<String, Error>>,
+    ) -> Result<Vec<String>, Error> {
         // aux_set  is used only to deduplicate
         // so we're still using a normal Vec, and perform deduplication at load time
         let mut aux_set = HashSet::new();
-        for line in it.by_ref() {
-            let line = line.unwrap();
-            let word = line_to_word(line);
-            if !aux_set.contains(&word) {
-                //println!("Inserisco: {}", word);
-                aux_set.insert(word.clone());
-                self.words.push(word);
-            }
+        lines
+            .filter(|res| match res {
+                Ok(word) => aux_set.insert(word.clone()),
+                _ => false,
+            })
+            .collect()
+    }
+
+    fn load(fname: String) -> Result<Self, Error> {
+        let maybe_words = File::open(fname)
+            .and_then(|open_f| Ok(BufReader::new(open_f)))
+            .and_then(|buf| Self::words_from_iterable(buf.lines()));
+
+        match maybe_words {
+            Ok(words) => Ok(Dictionary {
+                words,
+                iter_position: 0,
+            }),
+            Err(err) => Err(err),
         }
     }
 }
@@ -84,14 +96,13 @@ fn main() {
     let fname = &args[1];
     let pattern = &args[2];
 
-    let f = File::open(fname).unwrap();
-    let buf = BufReader::new(&f);
-    let mut d = Dictionary::default();
-    d.load_from_iterable(buf.lines());
+    let d = Dictionary::load(fname.to_string());
 
     //let filter = matches_regexp(pattern);
     let filter = is_anagram(pattern);
-    for w in d.words.iter().filter(filter) {
-        println!("{}", w)
-    }
+    if let Ok(dict) = d {
+        for w in dict.words.iter().filter(filter) {
+            println!("{}", w);
+        }
+    };
 }