///|
/// BAI (BAM index) Demo.
///
/// Demonstrates the Rsamtools / htslib BAI index port: the reg2bins binning
/// scheme, parsing a `.bai` file, and querying a half-open region to recover
/// the BGZF virtual-offset chunks for random access. The index data is a
/// canned (offline) fixture.
///|
fn main raise {
println("=== 1. reg2bins: interval -> covering bin numbers ===")
let bins_a = @src.bai_reg2bins(0, 100)
println("reg2bins(0, 100) -> \{bins_a.length()} bins: 0 1 9 73 585 4681")
let bins_b = @src.bai_reg2bins(500000, 520000)
println(
"reg2bins(500000, 520000) -> [\{bins_b[0]}, \{bins_b[4]}, \{bins_b[5]}, \{bins_b[6]}]",
)
println("\n=== 2. Parse a BAI index ===")
let idx = @src.parse_bai(
@src.base64_decode(
"QkFJAQIAAAACAAAAAAAAAAEAAABkAAAAAAAAAMgAAAAAAAAAAwAAAAIAAAAsAQAAAAAAAJABAAAAAAAA9AEAAAAAAABYAgAAAAAAAAMAAABkAAAAAAAAAGQAAAAAAAAALAEAAAAAAAABAAAAAQAAAAEAAADoAwAAAAAAAEwEAAAAAAAAAQAAAOgDAAAAAAAABwAAAAAAAAA=",
),
)
println("n_ref = \{idx.n_ref}")
for i = 0; i < idx.references.length(); i = i + 1 {
let r = idx.references[i]
println(
" ref \{i}: \{r.bins.length()} bins, \{r.linear.length()} linear entries",
)
}
println("\n=== 3. Query a region on ref 0 ===")
let q = @src.bai_query(idx, 0, 0, 100)
println("min_off = \{q.min_off}")
for j = 0; j < q.chunks.length(); j = j + 1 {
let c = q.chunks[j]
println(" chunk [\{c.chunk_beg}, \{c.chunk_end})")
}
println("\n=== 4. Out-of-range reference is rejected ===")
let err = try {
ignore(@src.bai_query(idx, 9, 0, 100))
""
} catch {
BaiIndexError(msg) => msg
}
println("error: \{err}")
}