///|
/// 流式(记录级惰性)解析演示: 逐条与分批处理大 FASTA/FASTQ.
fn main raise {
  let fasta = ">seq1 kinase-like\nMKTLLLTLVV\nMKTAYIAKQR\n>seq2\nGGGGTTTTCCCCAA\n>seq3\nACGTACGTAC\n"
  println("=== 流式 FASTA: 逐条 ===")
  @src.fasta_each_record(fasta, fn(rec) {
    println("  " + rec.id + ": len=" + rec.seq.length().to_string())
  })
  println("=== 流式 FASTA: 游标暂停/恢复 ===")
  let cursor = @src.SeqioCursor::new()
  let first = @src.fasta_next_record(fasta, cursor).unwrap()
  println("  first: " + first.id)
  let second = @src.fasta_next_record(fasta, cursor).unwrap()
  println("  second: " + second.id + " seq=" + second.seq.to_string())
  println("=== 流式 FASTA: 分批(每批2条) ===")
  @src.fasta_chunks(fasta, 2, fn(batch) {
    let ids = batch.map(fn(r) { r.id })
    println(
      "  batch(size=" + batch.length().to_string() + "): " + ids.join(", "),
    )
  })
  let fastq = "@r1 first\nACGTACGT\n+\nIIIIIIII\n@r2\nGGGGCCCC\n+\nFFFFFFFF\n@r3\nTTTTAAAA\n+\n!!!!!!!!\n"
  println("=== 流式 FASTQ: 逐条(含质量统计) ===")
  @src.fastq_each_record(fastq, fn(rec) {
    let quals = rec.letter_annotations.get("phred_quality").unwrap()
    let mut qsum = 0
    for q in quals {
      qsum = qsum + q
    }
    let mean_q = qsum.to_double() / quals.length().to_double()
    println(
      "  " +
      rec.id +
      ": len=" +
      rec.seq.length().to_string() +
      " meanQ=" +
      mean_q.to_string(),
    )
  })
  println("=== 流式 FASTQ: 分批(每批2条) ===")
  @src.fastq_chunks(fastq, 2, fn(batch) {
    println("  batch size=" + batch.length().to_string())
    for rec in batch {
      println("    - " + rec.id)
    }
  })
}