docs: def fastqlite(handle):
      """Return a sequence of namedtuple objects from a fastq file with
      attributes (id, description, seq, qual) given open file-like
      object ``handle``. This parser assumes that lines corresponding to
      sequences and quality scores are not wrapped. Raises
      ``ValueError`` for malformed records.
  
      See https://doi.org/10.1093/nar/gkp1137 for a discussion of the
      fastq format.
  
      """
  
      Seq = namedtuple('Seq', ['id', 'description', 'seq', 'qual'])
      for i, chunk in enumerate(grouper(handle, 4, '')):
          description, seq, plus, qual = chunk
          seq, qual = seq.strip(), qual.strip()
  
          checks = [description.startswith('@'), seq,
                    plus.startswith('+'), qual, len(seq) == len(qual)]
  
          if not all(checks):
              raise ValueError('Malformed record around line {}'.format(i * 4))
  
          description = description[1:].strip()
          yield Seq(description.split()[0], description, seq, qual)