summaryrefslogtreecommitdiffstats
path: root/rosalind/fasta.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rosalind/fasta.rs')
-rw-r--r--rosalind/fasta.rs45
1 files changed, 45 insertions, 0 deletions
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);
+ }
+ }
+}