///|
/// slingshot Single-cell Trajectory Inference Demo.
fn main {
  println("=== slingshot Single-cell Trajectory Inference Demo ===\n")

  // Simulate single-cell data with 3 clusters
  println("1. Creating simulated single-cell data...")
  let cell_coords : Array[Array[Double]] = [
    [0.0, 0.0],
    [0.2, 0.1],
    [0.4, 0.2], // Cluster 1 (root)
    [1.0, 0.5],
    [1.5, 0.8],
    [2.0, 1.0], // Cluster 2 (intermediate)
    [3.0, 1.2],
    [3.5, 1.3],
    [4.0, 1.5], // Cluster 3 (terminal)
    [2.5, 2.0],
    [3.0, 2.5],
    [3.5, 3.0], // Cluster 4 (alternative branch)
  ]
  let cluster_labels = [
    "c1", "c1", "c1", "c2", "c2", "c2", "c3", "c3", "c3", "c4", "c4", "c4",
  ]
  println("   Cells: \{cell_coords.length()}, Clusters: 4")

  // Run slingshot
  println("\n2. Running slingshot trajectory inference...")
  let params = @src.SlingshotParams::new()
  let result = @src.slingshot_run(cell_coords, cluster_labels, params)
  println("   Nodes: \{result.nodes.length()}")
  println("   Edges: \{result.edges.length()}")
  println("   Curves: \{result.curves.length()}")

  // Compute pseudotime
  println("\n3. Cell pseudotime values:")
  let mut i = 0
  while i < result.cell_pseudotime.length() && i < 6 {
    let pt = result.cell_pseudotime[i].to_string()
    println("   Cell \{i}: pseudotime=\{pt}")
    i = i + 1
  }

  // Sorted pseudotime
  println("\n4. Cells sorted by pseudotime:")
  let sorted = result.sling_sorted_pseudotime()
  let mut j = 0
  while j < sorted.length() && j < 5 {
    let (pt, cell_idx) = sorted[j]
    let pt_str = pt.to_string()
    println(
      "   Rank \{j}: Cell \{cell_idx}, pseudotime=\{pt_str}, cluster=\{cluster_labels[cell_idx]}",
    )
    j = j + 1
  }

  // MST edges
  println("\n5. Minimum spanning tree edges:")
  let mut e = 0
  while e < result.edges.length() {
    let w = result.edges[e].weight.to_string()
    println(
      "   \{result.edges[e].from_id} -> \{result.edges[e].to_id} (weight=\{w})",
    )
    e = e + 1
  }

  println("\n=== slingshot Demo Complete ===")
}