summaryrefslogblamecommitdiffstats
path: root/rosalind/fasta.rs
blob: c4c828f119e3e7a014aac21ed7c4a82e700ce2b4 (plain) (tree)
1
2
3
4
5
6
7
8





                                        

                        






                                                
                                     







                                                      
                                                 












                                                    
                                                                  




                                                   









                                                       
 
use core::io::{stdin,Reader,ReaderUtil};
use str = core::str;

const EOF: char = -1 as char;

struct FASTAReader {
    in:          Reader,
    priv peeked: char,
}

impl FASTAReader {
    static fn new() -> FASTAReader {
        FASTAReader { in: stdin(), peeked: EOF }
    }

    fn read_line(&mut 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
    }

    fn read_sequence(&mut 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)
    }

    pub fn each_sequence(&mut self, cb: &fn(~str, ~str) -> bool) {
        while !self.in.eof() {
            let (name, dna) = self.read_sequence();
            cb(name, dna);
        }
    }

    pub fn sequences(&mut self) -> (~[~str], ~[~str]) {
        let mut names = ~[];
        let mut dnas  = ~[];
        for self.each_sequence |name, dna| {
            names.push(name);
            dnas.push(dna);
        }
        (names, dnas)
    }
}