pub struct KmerIterator<I>
where
I: Iterator<Item = Vec<u8>>,
{
fasta_reads_iterator: I,
k: usize,
i: usize,
current_read: Option<Vec<u8>>,
}
impl<I> KmerIterator<I>
where
I: Iterator<Item = Vec<u8>>,
{
pub fn from(fasta_reads_iterator: I, k: usize) -> Self {
Self {
fasta_reads_iterator,
k,
i: 0,
current_read: None,
}
}
}
impl<I> Iterator for KmerIterator<I>
where
I: Iterator<Item = Vec<u8>>,
{
type Item = Vec<u8>;
fn next(&mut self) -> Option<Self::Item> {
if self.current_read.is_none() {
self.current_read = Some(self.fasta_reads_iterator.next()?);
}
let mut read = self.current_read.clone().unwrap();
while self.i + self.k >= read.len() {
self.i = 0;
read = self.fasta_reads_iterator.next()?;
}
let start = self.i;
let end = self.i + self.k;
let kmer = read.iter().take(end).skip(start).copied().collect();
self.i += 1;
Some(kmer)
}
}