///|
/// diffcyt module demo - Differential discovery in high-dimensional cytometry.
///
/// Demonstrates FlowSOM clustering, differential abundance (DA) testing,
/// and differential state (DS) testing on simulated CyTOF data.
///
/// Reference: Weber LM & Robinson MD (2016) diffcyt. Nat Methods 17:792.
/// Run: moon run examples/diffcyt_demo
fn main {
  println("=== diffcyt Module Demo ===")
  println("Differential discovery in high-dimensional cytometry")
  println("Reference: Bioconductor diffcyt")
  println("")

  // ------------------------------------------------------------------
  // 1. Load sample data
  // ------------------------------------------------------------------
  println("=== 1. Load Sample Data ===")
  let cells = @bio.diffcyt_sample_data()
  println("Total cells: " + cells.length().to_string())
  let samples = @bio.diffcyt_unique_samples(cells)
  let conditions = @bio.diffcyt_unique_conditions(cells)
  println("Samples: " + samples.length().to_string())
  println("Conditions: " + repr(conditions))
  println("Markers: " + cells[0].n_markers().to_string())
  println("")

  // ------------------------------------------------------------------
  // 2. Cluster cells (FlowSOM)
  // ------------------------------------------------------------------
  println("=== 2. Cluster Cells (FlowSOM) ===")
  let n_clusters = 5
  let _codebooks = @bio.diffcyt_cluster_cells(cells, n_clusters, 10)
  println("Number of clusters: " + n_clusters.to_string())
  // Count cells per cluster.
  let cluster_counts = Array::make(n_clusters, 0)
  for cell in cells {
    cluster_counts[cell.cluster_id()] = cluster_counts[cell.cluster_id()] + 1
  }
  for i in 0..