#[path = "common/mod.rs"]
#[allow(dead_code)]
mod common;
use std::sync::atomic::{AtomicU64, Ordering};
use anyhow::Result;
use clap::Parser;
use common::input_handle;
use paraseq::fastx::RefRecord;
use paraseq::{fastx, prelude::*};
#[derive(Parser)]
struct Cli {
input: Option<String>,
#[clap(short = 'T', long, default_value_t = 0)]
threads: usize,
#[clap(short, long, default_value_t = 1024)]
batch_size: usize,
}
fn main() -> Result<()> {
let args = Cli::parse();
let byte_sum = AtomicU64::new(0);
let num_records = AtomicU64::new(0);
let byte_sum_ref = &byte_sum;
let num_records_ref = &num_records;
let mut processor = |batch: &mut dyn Iterator<Item = RefRecord>| {
let mut local_bytes = 0u64;
let mut local_records = 0u64;
for record in batch {
local_bytes += record.seq().iter().map(|&b| u64::from(b)).sum::<u64>();
local_records += 1;
}
byte_sum_ref.fetch_add(local_bytes, Ordering::Relaxed);
num_records_ref.fetch_add(local_records, Ordering::Relaxed);
Ok(())
};
let reader = fastx::Reader::new_with_batch_size(input_handle(&args.input)?, args.batch_size)?;
reader.process_parallel(&mut processor, args.threads)?;
println!("num_records: {}", num_records.into_inner());
println!("byte_sum: {}", byte_sum.into_inner());
Ok(())
}