ICFP 2007 Contest: https://web.archive.org/web/20090301164728/https://save-endo.cs.uu.nl/

Abstract parser.rs for abstract iterators

Changed files
+42 -34
dna2rna
+6 -6
dna2rna/src/main.rs
···
let Ok(prefix) = fs::read_to_string(&args[1]) else {
println!("Failed to read prefix file at {}", &args[1]);
-
return;
+
return;
};
let Ok(dna) = fs::read_to_string(&args[2]) else {
-
println!("Failed to read dna file at {}", &args[2]);
-
return;
+
println!("Failed to read dna file at {}", &args[2]);
+
return;
};
let mut dna = dna::DnaRef::from_string(&prefix) + dna::DnaRef::from_string(&dna);
let Ok(mut rna_file) = File::create(&args[3]) else {
println!("Failed to create rna output file at {}", &args[3]);
-
return;
+
return;
};
let mut rna = Vec::new();
loop {
···
for r in rna.iter() {
let rna_str: String = r.iter().map(|b| b.to_char()).collect();
-
// Just tolerate a write error.
+
// Just tolerate a write error.
let _ = rna_file.write(rna_str.as_bytes());
-
let _ = rna_file.write(b"\n");
+
let _ = rna_file.write(b"\n");
}
rna.clear();
+1 -1
dna2rna/src/match_replace.rs
···
}
pub fn match_replace(dna: DnaRef, rna: &mut Vec<Rna>) -> Option<DnaRef> {
-
let mut parser = Parser::new(&dna);
+
let mut parser = Parser::new(dna.iter());
let pattern = parser.pattern(rna)?;
let template = parser.template(rna)?;
let index = parser.index();
+35 -27
dna2rna/src/parser.rs
···
use crate::dna::Base;
-
use crate::dna::DnaIterator;
-
use crate::dna::DnaRef;
use crate::pattern::Pattern;
use crate::pattern::PatternItem;
use crate::rna::Rna;
···
use crate::template::TemplateItem;
use std::mem;
-
pub struct Parser<'a> {
-
iter: DnaIterator<'a>,
+
pub struct Parser<I>
+
where
+
I: Iterator<Item = Base>,
+
{
+
iter: I,
peeked: Vec<Base>,
index: usize,
}
-
impl<'a> Parser<'a> {
-
pub fn new(buf: &'a DnaRef) -> Parser<'a> {
+
impl<I> Parser<I>
+
where
+
I: Iterator<Item = Base>,
+
{
+
pub fn new(iter: I) -> Parser<I> {
Parser {
-
iter: buf.iter(),
+
iter: iter,
peeked: Vec::new(),
index: 0,
}
···
mod tests {
use super::*;
+
fn dna_from_str(s: &str) -> Vec<Base> {
+
s.chars().filter_map(|c| Base::from_char(c)).collect()
+
}
+
#[test]
fn test_base() {
-
let dna = DnaRef::from_string("ICFP");
-
let mut parser = Parser::new(&dna);
+
let dna = dna_from_str("ICFP").into_iter();
+
let mut parser = Parser::new(dna);
assert!(parser.next_is(&[Base::I]));
assert!(parser.next_is(&[Base::I, Base::C]));
assert!(parser.next_is(&[Base::I, Base::C, Base::F]));
···
#[test]
fn test_nat() {
-
let dna = DnaRef::from_string("CP");
-
let mut parser = Parser::new(&dna);
+
let dna = dna_from_str("CP").into_iter();
+
let mut parser = Parser::new(dna);
assert_eq!(parser.nat(), Some(1));
assert_eq!(parser.index, 2);
-
let dna = DnaRef::from_string("ICICP");
-
let mut parser = Parser::new(&dna);
+
let dna = dna_from_str("ICICP").into_iter();
+
let mut parser = Parser::new(dna);
assert_eq!(parser.nat(), Some(10));
assert_eq!(parser.index, 5);
-
let dna = DnaRef::from_string("III");
-
let mut parser = Parser::new(&dna);
+
let dna = dna_from_str("III").into_iter();
+
let mut parser = Parser::new(dna);
assert_eq!(parser.nat(), None);
assert_eq!(parser.index, 3);
}
#[test]
fn test_consts() {
-
let dna = DnaRef::from_string("CFPICIIC");
-
let mut parser = Parser::new(&dna);
+
let dna = dna_from_str("CFPICIIC").into_iter();
+
let mut parser = Parser::new(dna);
assert_eq!(parser.consts(), &[Base::I, Base::C, Base::F, Base::P]);
assert_eq!(parser.index, 5);
}
···
fn test_pattern() {
let mut rna = Vec::new();
-
let dna = DnaRef::from_string("CIIC");
-
let mut parser = Parser::new(&dna);
+
let dna = dna_from_str("CIIC").into_iter();
+
let mut parser = Parser::new(dna);
assert_eq!(
parser.pattern(&mut rna),
Some(vec![PatternItem::Base(Base::I)])
);
assert_eq!(parser.index, 4);
-
let dna = DnaRef::from_string("IIPIPICPIICICIIF");
-
let mut parser = Parser::new(&dna);
+
let dna = dna_from_str("IIPIPICPIICICIIF").into_iter();
+
let mut parser = Parser::new(dna);
assert_eq!(
parser.pattern(&mut rna),
Some(vec![
···
);
assert_eq!(parser.index, 16);
-
let dna = DnaRef::from_string("IIIPFCICFPIIC");
-
let mut parser = Parser::new(&dna);
+
let dna = dna_from_str("IIIPFCICFPIIC").into_iter();
+
let mut parser = Parser::new(dna);
assert_eq!(parser.pattern(&mut rna), Some(vec![]));
assert_eq!(parser.index, 13);
assert_eq!(
···
fn test_template() {
let mut rna = Vec::new();
-
let dna = DnaRef::from_string("CFPICIFCPICPIIPIICPIIC");
-
let mut parser = Parser::new(&dna);
+
let dna = dna_from_str("CFPICIFCPICPIIPIICPIIC").into_iter();
+
let mut parser = Parser::new(dna);
assert_eq!(
parser.template(&mut rna),
Some(vec![
···
);
assert_eq!(parser.index, 22);
-
let dna = DnaRef::from_string("IIIPFCICFPIIC");
-
let mut parser = Parser::new(&dna);
+
let dna = dna_from_str("IIIPFCICFPIIC").into_iter();
+
let mut parser = Parser::new(dna);
assert_eq!(parser.template(&mut rna), Some(vec![]));
assert_eq!(parser.index, 13);
assert_eq!(