Browse Source

anagrams!

boyska 4 years ago
parent
commit
7b1a6a93e3
1 changed files with 36 additions and 6 deletions
  1. 36 6
      src/main.rs

+ 36 - 6
src/main.rs

@@ -53,20 +53,50 @@ fn line_to_word(l: String) -> String {
     l
 }
 
+// filtri {{{
+
+// i filtri dovrebbero essere creati da una struct Config{} creata parsando gli argomenti
+
+fn matches_regexp(regexp: &str) -> (impl std::ops::FnMut(&&String) -> bool) {
+    // filtro
+    let re = Regex::new(regexp).unwrap();
+    move |w|  re.is_match(w.as_str())
+}
+
+
+
+fn sort_word(word: &str) -> Result<String, impl std::error::Error> {
+    // funzione ausiliaria, utile per la is_anagram e cose simili
+    // ritorna una COPIA
+    // esempio: house -> ehosu
+    let mut w_bytes = word.to_string().clone().into_bytes();
+    w_bytes.sort();
+    String::from_utf8(w_bytes)
+}
+
+fn is_anagram(word: &str) -> (impl std::ops::FnMut(&&String) -> bool) {
+    // filtro
+    let sorted_word = sort_word(word).unwrap();
+    move |w| {
+        sorted_word == sort_word(w.as_str()).unwrap()
+    }
+}
+
+// filtri }}}
+
 fn main() {
     let args: Vec<String> = env::args().collect();
     let fname = &args[1];
-    let regexp = &args[2];
+    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 re = Regex::new(regexp).unwrap();
-    for w in d {
-        if re.is_match(w.as_str()) {
-            println!("{}", w)
-        }
+    //let filter = matches_regexp(pattern);
+    let filter = is_anagram(pattern);
+    for w in d.words.iter().filter(filter) {
+        println!("{}", w)
     }
 }