aboutsummaryrefslogtreecommitdiff
path: root/nucleotide-count/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'nucleotide-count/src/lib.rs')
-rw-r--r--nucleotide-count/src/lib.rs21
1 files changed, 21 insertions, 0 deletions
diff --git a/nucleotide-count/src/lib.rs b/nucleotide-count/src/lib.rs
new file mode 100644
index 0000000..98b0c38
--- /dev/null
+++ b/nucleotide-count/src/lib.rs
@@ -0,0 +1,21 @@
1use maplit::hashmap;
2use std::collections::HashMap;
3
4pub fn count(nucleotide: char, dna: &str) -> Result<usize, char> {
5 nucleotide_counts(dna)?
6 .remove(&nucleotide)
7 .ok_or(nucleotide)
8}
9
10pub fn nucleotide_counts(dna: &str) -> Result<HashMap<char, usize>, char> {
11 dna.chars().fold(
12 Ok(hashmap![ 'A' => 0, 'C' => 0, 'G' => 0, 'T' => 0 ]),
13 |acc, n| match n {
14 'A' | 'C' | 'G' | 'T' => acc.map(|mut hmap| {
15 hmap.entry(n).and_modify(|e| *e += 1).or_insert(0);
16 hmap
17 }),
18 _ => Err(n),
19 },
20 )
21}