]> Repositorios git - scryer-prolog.git/commitdiff
HashSet -> BTreeSet: Make parsing or results and thus tests deterministic. Add comments.
authorNicolas Luck <[email protected]>
Thu, 27 Jul 2023 10:06:03 +0000 (12:06 +0200)
committerNicolas Luck <[email protected]>
Thu, 27 Jul 2023 10:06:03 +0000 (12:06 +0200)
src/machine/lib_machine.rs

index 1eec92b820fd6f262e65672b3209b641d508a4f2..b75f9b6d7edeee0694917f744be5aa16c379bc97 100644 (file)
@@ -1,4 +1,4 @@
-use std::collections::HashSet;
+use std::collections::BTreeSet;
 
 use super::{
     Machine, MachineConfig, QueryResult, QueryResolutionLine, 
@@ -36,19 +36,24 @@ impl Machine {
             Err(output)
         } else {
             // Remove duplicate lines
-            let output = output
-                .lines()
-                .collect::<HashSet<&str>>()
+            Ok(output
+                // 1. Split into disjunct matches
+                .split(";")
+                .map(|s| s.trim())
+                // 2. Dedupe through Set
+                .collect::<BTreeSet<&str>>()
                 .iter()
                 .cloned()
+                // 3. Back to Vec
                 .collect::<Vec<&str>>()
-                .join("\n");
-            Ok(output
-                .split(";")
+                .iter()
+                // 4. Trim and remove empty lines
                 .map(|s| s.trim())
                 .map(|s| s.replace(".", ""))
                 .filter(|s| !s.is_empty())
+                // 5. Parse into QueryResolutionLine
                 .map(QueryResolutionLine::try_from)
+                // 6. Remove lines that couldn't be parsed, so we still keep the ones they did
                 .filter_map(Result::ok)
                 .collect::<Vec<QueryResolutionLine>>()
                 .into())
@@ -154,10 +159,10 @@ mod tests {
             result,
             Ok(QueryResolution::Matches(vec![
                 QueryMatch::from(btreemap! {
-                    "Class" => Value::from("Todo")
+                    "Class" => Value::from("Recipe")
                 }),
                 QueryMatch::from(btreemap! {
-                    "Class" => Value::from("Recipe")
+                    "Class" => Value::from("Todo")
                 }),
             ]))
         );