///|
/// bedtools-style interval arithmetic demo: merge, intersect, and interval tree.

///|
fn main {
  // merge book-ended / overlapping intervals
  let merged = @src.bedtools_merge([
    @src.BedInterval::new("chr1", 0, 10),
    @src.BedInterval::new("chr1", 5, 20),
    @src.BedInterval::new("chr1", 20, 30),
    @src.BedInterval::new("chr2", 5, 10),
  ])
  println("=== merge ===")
  for iv in merged {
    println("  \{iv.chrom}:\{iv.start}-\{iv.end}")
  }

  // intersect A against B
  let hit = @src.bedtools_intersect(
    [
      @src.BedInterval::new("chr1", 0, 10),
      @src.BedInterval::new("chr1", 15, 25),
    ],
    [@src.BedInterval::new("chr1", 5, 20)],
  )
  println("=== intersect (A overlapping B) ===")
  for iv in hit {
    println("  \{iv.chrom}:\{iv.start}-\{iv.end}")
  }

  // interval tree query
  let tree = @src.interval_tree_new([0, 10, 20], [5, 15, 25])
  println("=== interval tree query [8, 12) → \{Repr(tree.query(8, 12))}")

  // closest / window
  let cl = @src.bedtools_closest(
    [
      @src.BedInterval::new("chr1", 100, 200),
      @src.BedInterval::new("chr1", 500, 600),
    ],
    [
      @src.BedInterval::new("chr1", 250, 300),
      @src.BedInterval::new("chr1", 450, 480),
    ],
  )
  for r in cl {
    println(
      "  closest: \{r.a.start}-\{r.a.end} -> \{r.b.start}-\{r.b.end} (d=\{r.distance})",
    )
  }

  // coverage + genomecov
  let cov = @src.bedtools_coverage([@src.BedInterval::new("chr1", 0, 10)], [
    @src.BedInterval::new("chr1", 3, 7),
    @src.BedInterval::new("chr1", 6, 9),
  ])
  for c in cov {
    println(
      "  coverage: count=\{c.count} covered=\{c.bases_covered}/\{c.length} frac=\{c.fraction}",
    )
  }
  let segs = @src.bedtools_genomecov_bg([
    @src.BedInterval::new("chr1", 3, 7),
    @src.BedInterval::new("chr1", 6, 9),
  ])
  for s in segs {
    println("  genomecov: \{s.chrom}:\{s.start}-\{s.end} depth=\{s.depth}")
  }
}