///|
fn main {
  println("=== methylGSA Demo ===")

  let input = @src.methylgsa_sample_input()
  println("\n1. Input: " + input.cpg_ids.length().to_string() + " CpGs")
  for i in 0.. println("   " + g + ": " + p.to_string())
      None => ()
    }
  }

  println("\n3. Gene sets")
  let sets = @src.methylgsa_sample_gene_sets()
  for name in sets.keys() {
    match sets.get(name) {
      Some(genes) => {
        let mut line = name + ": "
        for g in genes {
          line = line + g + " "
        }
        println("   " + line)
      }
      None => ()
    }
  }

  println("\n4. methylRRA-OLS results")
  let ols_results = @src.methylrra_ols(input, gene_sets=sets)
  for r in ols_results {
    println(
      "   " +
      r.set_name +
      " | size=" +
      r.set_size.to_string() +
      " | stat=" +
      r.statistic.to_string() +
      " | p=" +
      r.pvalue.to_string() +
      " | q=" +
      r.qvalue.to_string(),
    )
  }

  println("\n5. methylRRA-Robust results")
  let robust_results = @src.methylrra_robust(input, gene_sets=sets)
  for r in robust_results {
    println(
      "   " +
      r.set_name +
      " | size=" +
      r.set_size.to_string() +
      " | stat=" +
      r.statistic.to_string() +
      " | p=" +
      r.pvalue.to_string() +
      " | q=" +
      r.qvalue.to_string(),
    )
  }

  println("\n6. BH-FDR correction")
  let results : Array[@src.MethylgsaResult] = Array(capacity=0)
  results.push(
    @src.methylgsa_result_new(
      set_name="SetA",
      set_size=10,
      statistic=5.0,
      pvalue=0.001,
      qvalue=1.0,
    ),
  )
  results.push(
    @src.methylgsa_result_new(
      set_name="SetB",
      set_size=10,
      statistic=3.0,
      pvalue=0.01,
      qvalue=1.0,
    ),
  )
  results.push(
    @src.methylgsa_result_new(
      set_name="SetC",
      set_size=10,
      statistic=1.0,
      pvalue=0.05,
      qvalue=1.0,
    ),
  )
  let adjusted = @src.methylgsa_bh(results)
  for r in adjusted {
    println(
      "   " +
      r.set_name +
      ": p=" +
      r.pvalue.to_string() +
      " -> q=" +
      r.qvalue.to_string(),
    )
  }

  println("\n7. Empty set handling")
  let empty_sets : Map[String, Array[String]] = Map([], capacity=1)
  empty_sets.set("EMPTY", ["NO_SUCH_GENE"])
  let empty_res = @src.methylrra_robust(input, gene_sets=empty_sets)
  for r in empty_res {
    println(
      "   " +
      r.set_name +
      ": size=" +
      r.set_size.to_string() +
      ", p=" +
      r.pvalue.to_string(),
    )
  }
}