///|
fn main {
  println("=== FGSEA (Fast Gene Set Enrichment Analysis) Demo ===")

  let gene_sets = @bio.sample_gene_sets()
  let stats = @bio.sample_gene_stats()

  println("")
  println("Input:")
  println("  Gene sets: " + gene_sets.length().to_string())
  println("  Ranked genes: " + stats.length().to_string())

  println("")
  println("Top 10 ranked genes:")
  let mut i = 0
  while i < 10 && i < stats.length() {
    let (gene, stat) = stats[i]
    println(
      "  " +
      (i + 1).to_string() +
      ". " +
      gene +
      " (stat=" +
      stat.to_string() +
      ")",
    )
    i = i + 1
  }

  println("")
  println("Running FGSEA with 100 permutations...")
  let results = @bio.fgsea(gene_sets, stats, nperm=100)

  println("")
  println("FGSEA Results:")
  println("==============")

  i = 0
  while i < results.length() {
    let r = results[i]
    println("")
    println("Pathway: " + r.pathway)
    println("  ES: " + r.es.to_string())
    println("  NES: " + r.nes.to_string())
    println("  p-value: " + r.pval.to_string())
    println("  adj.pval: " + r.padj.to_string())
    println("  Size: " + r.size.to_string())
    println("  Leading edge genes: " + r.leadingEdge.length().to_string())
    i = i + 1
  }

  let top_up = @bio.fgsea_top_up(results, n=3)
  println("")
  println("Top 3 Up-regulated Pathways:")
  i = 0
  while i < top_up.length() {
    let r = top_up[i]
    println(
      "  " +
      (i + 1).to_string() +
      ". " +
      r.pathway +
      " (NES=" +
      r.nes.to_string() +
      ")",
    )
    i = i + 1
  }

  let top_down = @bio.fgsea_top_down(results, n=3)
  println("")
  println("Top 3 Down-regulated Pathways:")
  i = 0
  while i < top_down.length() {
    let r = top_down[i]
    println(
      "  " +
      (i + 1).to_string() +
      ". " +
      r.pathway +
      " (NES=" +
      r.nes.to_string() +
      ")",
    )
    i = i + 1
  }

  println("")
  println("=== Demo Complete ===")
}