fastxgz 0.4.0

A fasta/fastq parser for both compressed and not compressed files.
Documentation
/// An iterator taking a sequence of string and yielding their kmers.
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() {
            // we reached the end of the read we are extracting k-mers from
            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)
    }
}