genepred 0.0.8

port for the GenePred format in Rust
Documentation
<p align="center">
  <p align="center">
    <img width=200 align="center" src="./assets/gp.png" >
  </p>

  <span>
    <h1 align="center">
        genepred
    </h1>
  </span>

  <p align="center">
    <a href="https://img.shields.io/badge/version-0.0.8-green" target="_blank">
      <img alt="Version Badge" src="https://img.shields.io/badge/version-0.0.8-green">
    </a>
    <a href="https://crates.io/crates/genepred" target="_blank">
      <img alt="Crates.io Version" src="https://img.shields.io/crates/v/genepred">
    </a>
    <a href="https://github.com/alejandrogzi/genepred" target="_blank">
      <img alt="GitHub License" src="https://img.shields.io/github/license/alejandrogzi/genepred?color=blue">
    </a>
    <a href="https://crates.io/crates/genepred" target="_blank">
      <img alt="Crates.io Total Downloads" src="https://img.shields.io/crates/d/genepred">
    </a>
  </p>

  <p align="center">
    <samp>
        <span> a port for the GenePred format in Rust</span>
        <br>
        <br>
        <a href="https://docs.rs/genepred/0.0.8/genepred/">docs</a> .
        <a href="https://github.com/alejandrogzi/genepred?tab=readme-ov-file#Usage">usage</a> .
        <a href="https://github.com/alejandrogzi/genepred?tab=readme-ov-file#Features">features</a> .
        <a href="https://github.com/alejandrogzi/genepred/blob/master/assets/EXAMPLES.md">examples</a>
    </samp>
  </p>

</p>

## Overview

This library provides a port to read genomic interval data in BED, GTF, and GFF (+ gz/zst/bz2) formats, representing them all as `GenePred` records.

## Quick Start

Add this to your `Cargo.toml`:

```toml
[dependencies]
genepred = "0.0.8"

# Optional features
genepred = { version = "0.0.8", features = ["gzip", "zstd", "bz2", "mmap", "rayon"] }
```

## Usage

```rust,no_run
// Enable both "rayon" and "mmap" features in Cargo.toml
use genepred::{Reader, Bed12, Gtf};
use rayon::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Parallel processing of BED files, includes .gz/.zst/.bz2 files
    let bed_reader = Reader::<Bed12>::from_mmap("data/large.bed")?;

    if let Ok(records) = bed_reader.par_records() {
        let count = records
            .filter_map(Result::ok)
            .filter(|r| r.strand.map(|s| s.is_plus()).unwrap_or(false))
            .count();
        println!("Found {} records on plus strand", count);
    }

    // Parallel processing of GTF files, includes .gz/.zst/.bz2 files
    let gtf_reader = Reader::<Gtf>::from_mmap("data/annotations.gtf")?;

    if let Ok(records) = gtf_reader.par_records() {
        let total_exons: usize = records
            .filter_map(Result::ok)
            .map(|r| r.exon_count())
            .sum();
        println!("Total exons: {}", total_exons);
    }

    Ok(())
}
```

### Features

- `mmap`: Enable memory-mapped file support (adds `memmap2` dependency)
- `rayon`: Enable parallel processing (adds `rayon` dependency)
- `gzip`: Enable gzip support (adds `flate2` dependency)
- `zstd`: Enable zstd support (adds `zstd` dependency)
- `bz2`: Enable bzip2 support (adds `bzip2` dependency)