]> git.scottworley.com Git - tablify/blobdiff - src/lib.rs
Sort column counts
[tablify] / src / lib.rs
index 56a2b6ddec94a404a23d582bbf3b16fcc06bb5bc..fcf5dc822e790b15b377e6c154669f6b07524c71 100644 (file)
@@ -1,4 +1,6 @@
 #[cfg(test)]
+use std::collections::{HashMap, HashSet};
+#[cfg(test)]
 use std::io::BufRead;
 #[cfg(test)]
 use std::iter::Iterator;
@@ -66,6 +68,24 @@ fn read_rows(input: impl std::io::Read) -> impl Iterator<Item = Result<RowInput,
     Reader::new(std::io::BufReader::new(input).lines())
 }
 
+#[cfg(test)]
+fn column_counts(rows: &[RowInput]) -> Vec<(usize, String)> {
+    let mut counts: Vec<_> = rows
+        .iter()
+        .flat_map(|r| r.entries.iter().collect::<HashSet<_>>().into_iter())
+        .fold(HashMap::new(), |mut cs, e| {
+            cs.entry(String::from(e))
+                .and_modify(|n| *n += 1)
+                .or_insert(1);
+            cs
+        })
+        .into_iter()
+        .map(|(col, n)| (n, col))
+        .collect();
+    counts.sort();
+    counts
+}
+
 pub fn tablify(_input: &impl std::io::Read) -> String {
     String::from("Hello, world!")
 }
@@ -167,4 +187,32 @@ mod tests {
         assert!(bad2.is_err());
         assert!(format!("{bad2:?}").contains("3: Entry with no header"));
     }
+
+    #[test]
+    fn test_column_counts() {
+        assert_eq!(
+            column_counts(
+                &read_rows(&b"foo\n bar\n baz\n"[..])
+                    .collect::<Result<Vec<_>, _>>()
+                    .unwrap()
+            ),
+            vec![(1, String::from("bar")), (1, String::from("baz"))]
+        );
+        assert_eq!(
+            column_counts(
+                &read_rows(&b"foo\n bar\n baz\nquux\n baz"[..])
+                    .collect::<Result<Vec<_>, _>>()
+                    .unwrap()
+            ),
+            vec![(1, String::from("bar")), (2, String::from("baz"))]
+        );
+        assert_eq!(
+            column_counts(
+                &read_rows(&b"foo\n bar\n bar\n baz\n bar\nquux\n baz"[..])
+                    .collect::<Result<Vec<_>, _>>()
+                    .unwrap()
+            ),
+            vec![(1, String::from("bar")), (2, String::from("baz"))]
+        );
+    }
 }