fastx 0.6.1

FastX reads Fasta and FastQ files with little overhead.
Documentation
# FastX

FastX implements low overhead readers for Fasta and FastQ.
 - Version 0.3.0 added .gz support.
 - Version 0.5.0 added iterator support.
 - Version 0.5.2 added compressed fasta (fasta.gz).
 - Version 0.6.0 added high-performance `for_each` iteration, improved FASTQ parsing correctness, and exposed public API for indexed random access (.fai and .gzi).

## Examples

### High-Performance Reading (Recommended)

For maximum performance, use the `for_each` methods which reuse the internal buffer for each record, avoiding allocations.

```rust
use fastx::FastX::{self, FastXRead};
use std::path::Path;

fn main() -> std::io::Result<()> {
    let path = Path::new("sequences.fastq.gz");
    let reader = FastX::reader_from_path(path)?;

    // fastx_for_each automatically detects FASTA vs FASTQ
    FastX::fastx_for_each(reader,
        |record| {
            println!("FASTA: {}\tLen: {}", record.id(), record.seq_len());
        },
        |record| {
            println!("FASTQ: {}\tLen: {}", record.id(), record.seq_len());
        }
    )?;
    Ok(())
}
```

### Iterator-Based Reading (Convenient)

The iterator API is convenient for standard Rust loops but allocates a new buffer for each record.

```rust
use fastx::FastX::{self, FastXRead};
use std::path::Path;

fn main() -> std::io::Result<()> {
    let path = Path::new("sequences.fasta");
    let reader = FastX::reader_from_path(path)?;

    for result in FastX::fasta_iter(reader) {
        let record = result?;
        println!("{}\t{}", record.id(), record.seq_len());
    }
    Ok(())
}
```

### Random Access with Indexed Files

FastX supports random access to BGZF-compressed FASTA files using `.fai` and `.gzi` indexes.

```rust
use fastx::indexed::IndexedFastXReader;
use fastx::FastX::FastXRead;
use std::path::Path;

fn main() -> std::io::Result<()> {
    // Requires data.fasta.gz, data.fasta.gz.fai, and data.fasta.gz.gzi
    let mut reader = IndexedFastXReader::from_path(Path::new("data.fasta.gz"))?;

    // Fetch a specific sequence by ID
    let record = reader.fetch("chr1")?;
    println!("{}: {} bp", record.id(), record.seq_len());

    // Fetch a specific region (0-based start, exclusive end)
    let region = reader.fetch_range("chr1", 1000, 2000)?;
    println!("Region length: {}", region.len());
    
    Ok(())
}
```

## Features

FastX supports different compression backends through Cargo features. Choose the backend that best fits your needs:

### Default: Pure Rust Backend

By default, FastX uses the `rust-backend` feature, which provides a pure Rust implementation (miniz_oxide) for gzip decompression:

```toml
[dependencies]
fastx = "0.6"
```

This is the safest option with no C dependencies, making it ideal for cross-compilation and environments where you want to avoid native code.

### Alternative Backends

For better performance, you can select different compression backends:

**System zlib** - Uses the zlib library installed on your system (typically fastest on systems with optimized zlib):
```toml
[dependencies]
fastx = { version = "0.6", default-features = false, features = ["zlib"] }
```

**zlib-ng (compatibility mode)** - Modern, fast implementation that's API-compatible with zlib:
```toml
[dependencies]
fastx = { version = "0.6", default-features = false, features = ["zlib-ng-compat"] }
```

**zlib-ng (native API)** - Fastest option using zlib-ng's native API:
```toml
[dependencies]
fastx = { version = "0.6", default-features = false, features = ["zlib-ng"] }
```

### URL Support

Enable the `url` feature (enabled by default) to read indexed files directly from HTTP/HTTPS URLs:

```rust
let mut reader = IndexedFastXReader::from_url(
    "https://example.com/data.fasta.gz",
    "https://example.com/data.fasta.gz.fai",
    "https://example.com/data.fasta.gz.gzi"
)?;
```

### Performance Considerations

- **rust-backend**: Safe, portable, no build dependencies. Moderate performance.
- **zlib**: Good performance if your system has an optimized zlib (e.g., Intel's optimized version).
- **zlib-ng-compat**: Better performance than standard zlib on most systems.
- **zlib-ng**: Best performance, but requires C compiler at build time.