diff options
author | Jesse Luehrs <doy@tozt.net> | 2013-03-08 20:14:51 -0600 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2013-03-08 20:14:51 -0600 |
commit | ae98925062d5a392a73df4a1456df3a4a3be9b18 (patch) | |
tree | 3b89c49d97b9c38551578bf57619a9649dd0b4fb /rosalind/fasta.rs | |
parent | b331d192d8da5b7397240d7eced71cbf0ab8cc55 (diff) | |
download | rosalind-ae98925062d5a392a73df4a1456df3a4a3be9b18.tar.gz rosalind-ae98925062d5a392a73df4a1456df3a4a3be9b18.zip |
factor common behavior out into a library
Diffstat (limited to 'rosalind/fasta.rs')
-rw-r--r-- | rosalind/fasta.rs | 45 |
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); + } + } +} |