/*
* Created on Apr 27, 2006
*/
package org.seqcode.data.io;
import java.io.*;
import java.util.*;
import org.seqcode.gsebricks.iterators.SingleIterator;
import org.seqcode.gsebricks.verbs.*;
import org.seqcode.gseutils.*;
/**
* @author tdanford
*/
public class FASTALoader implements Expander<File,Pair<String,String>> {
public FASTALoader() {
}
/* (non-Javadoc)
* @see org.seqcode.gsebricks.verbs.Expander#execute(java.lang.Object)
*/
public Iterator<Pair<String, String>> execute(File a) {
SingleIterator<File> fitr = new SingleIterator<File>(a);
Iterator<String> lines = new ExpanderIterator<File,String>(new FileLineExpander(), fitr);
return new LazyFASTAIterator(lines);
}
private static class LazyFASTAIterator implements Iterator<Pair<String,String>> {
private Iterator<String> litr;
private String nextHeader;
public LazyFASTAIterator(Iterator<String> _litr) {
litr = _litr;
nextHeader = null;
if(litr.hasNext()) { nextHeader = litr.next(); }
}
/* (non-Javadoc)
* @see java.util.Iterator#hasNext()
*/
public boolean hasNext() {
return nextHeader != null;
}
/* (non-Javadoc)
* @see java.util.Iterator#next()
*/
public Pair<String, String> next() {
StringBuilder sb = new StringBuilder();
String header = nextHeader;
nextHeader = null;
String line = null;
while(litr.hasNext() && !(line = litr.next()).startsWith(">")) {
sb.append(line.trim());
}
if(litr.hasNext()) {
nextHeader = line.trim();
}
return new Pair<String,String>(header, sb.toString());
}
/* (non-Javadoc)
* @see java.util.Iterator#remove()
*/
public void remove() {
throw new UnsupportedOperationException();
}
}
}