summaryrefslogtreecommitdiffstats
path: root/rosalind
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2013-03-08 20:14:51 -0600
committerJesse Luehrs <doy@tozt.net>2013-03-08 20:14:51 -0600
commitae98925062d5a392a73df4a1456df3a4a3be9b18 (patch)
tree3b89c49d97b9c38551578bf57619a9649dd0b4fb /rosalind
parentb331d192d8da5b7397240d7eced71cbf0ab8cc55 (diff)
downloadrosalind-ae98925062d5a392a73df4a1456df3a4a3be9b18.tar.gz
rosalind-ae98925062d5a392a73df4a1456df3a4a3be9b18.zip
factor common behavior out into a library
Diffstat (limited to 'rosalind')
-rw-r--r--rosalind/dna.rs30
-rw-r--r--rosalind/fasta.rs45
-rw-r--r--rosalind/io.rs5
-rw-r--r--rosalind/mod.rc8
-rw-r--r--rosalind/str.rs21
5 files changed, 109 insertions, 0 deletions
diff --git a/rosalind/dna.rs b/rosalind/dna.rs
new file mode 100644
index 0000000..a2ee73d
--- /dev/null
+++ b/rosalind/dna.rs
@@ -0,0 +1,30 @@
+use str = core::str;
+
+pure fn gc_content(dna: ~str) -> float {
+ let mut content = 0;
+ for str::each_char(dna) |ch| {
+ match ch {
+ 'C' | 'G' => content += 1,
+ _ => (),
+ }
+ }
+ (content as float) / (str::len(dna) as float)
+}
+
+pure fn complement(base: char) -> char {
+ match base {
+ 'A' => 'T',
+ 'C' => 'G',
+ 'G' => 'C',
+ 'T' => 'A',
+ _ => fail ~"Unknown character found",
+ }
+}
+
+pure fn transcribe(base: char) -> char {
+ match base {
+ 'T' => 'U',
+ 'A' | 'C' | 'G' => base,
+ _ => fail ~"Unknown character found",
+ }
+}
diff --git a/rosalind/fasta.rs b/rosalind/fasta.rs
new file mode 100644
index 0000000..9cd80a1
--- /dev/null
+++ b/rosalind/fasta.rs
@@ -0,0 +1,45 @@
+use core::io::{stdin,Reader,ReaderUtil};
+use str = core::str;
+
+const EOF: char = -1 as char;
+
+struct FASTAReader {
+ in: Reader,
+ priv mut peeked: char,
+}
+
+impl FASTAReader {
+ static fn new() -> FASTAReader {
+ FASTAReader { in: stdin(), peeked: EOF }
+ }
+
+ priv fn read_line(&self) -> ~str {
+ let mut line = self.in.read_line();
+ if self.peeked != '>' {
+ str::unshift_char(&mut line, self.peeked);
+ }
+ self.peeked = self.in.read_char();
+ line
+ }
+
+ priv fn read_sequence(&self) -> (~str, ~str) {
+ if self.peeked == EOF {
+ self.peeked = self.in.read_char();
+ }
+
+ let name = self.read_line();
+ let mut dna = ~"";
+ while !self.in.eof() && self.peeked != '>' {
+ let line = self.read_line();
+ str::push_str(&mut dna, line);
+ }
+ (name, dna)
+ }
+
+ fn each_sequence(&self, cb: fn(~str, ~str) -> bool) {
+ while !self.in.eof() {
+ let (name, dna) = self.read_sequence();
+ cb(name, dna);
+ }
+ }
+}
diff --git a/rosalind/io.rs b/rosalind/io.rs
new file mode 100644
index 0000000..86abe3f
--- /dev/null
+++ b/rosalind/io.rs
@@ -0,0 +1,5 @@
+use core::io::{stdin,ReaderUtil};
+
+fn input_line() -> ~str {
+ stdin().read_line()
+}
diff --git a/rosalind/mod.rc b/rosalind/mod.rc
new file mode 100644
index 0000000..3908b83
--- /dev/null
+++ b/rosalind/mod.rc
@@ -0,0 +1,8 @@
+#[link(name = "rosalind", vers = "0.0.1", author = "doy")];
+
+#[crate_type = "lib"];
+
+mod dna;
+mod fasta;
+mod io;
+mod str;
diff --git a/rosalind/str.rs b/rosalind/str.rs
new file mode 100644
index 0000000..0fac1cd
--- /dev/null
+++ b/rosalind/str.rs
@@ -0,0 +1,21 @@
+use str = core::str;
+
+/* really feels like there should be a more efficient way to do this */
+fn reverse(s: &str) -> ~str {
+ let mut r = ~"";
+ str::reserve(&mut r, str::len(s));
+ for str::each_char(s) |ch| {
+ str::unshift_char(&mut r, ch)
+ }
+ r
+}
+
+pure fn hamming(string1: ~str, string2: ~str) -> int {
+ let mut hamming = 0;
+ for str::each_chari(string1) |i, ch| {
+ if ch != str::char_at(string2, i) {
+ hamming += 1;
+ }
+ }
+ hamming
+}