///|
/// MatrixGenerics module demo - Bioconductor-style row/col summary statistics.
///
/// Run: moon run examples/matrix_generics_demo
fn main {
  println("=== MatrixGenerics Module Demo ===")
  println(
    " efficient row and column summary statistics for matrix-like objects",
  )
  println(" Reference: Bioconductor MatrixGenerics package")
  println("")

  // ------------------------------------------------------------------
  // 1. Create a sample matrix
  // ------------------------------------------------------------------
  println("=== 1. Create sample matrix ===")
  let mat = @bio.MgMatrix::new([
    [1.0, 2.0, 3.0],
    [4.0, 5.0, 6.0],
    [7.0, 8.0, 9.0],
  ])
  println(
    "Dimensions: \{@bio.MgMatrix::dim_rows(mat)} rows x \{@bio.MgMatrix::dim_cols(mat)} cols",
  )
  println("Matrix data:")
  for i in 0..<@bio.MgMatrix::dim_rows(mat) {
    let row = @bio.MgMatrix::get_row(mat, i)
    println("  row \{i}: \{Repr(row)}")
  }
  println("")

  // ------------------------------------------------------------------
  // 2. Row summary statistics
  // ------------------------------------------------------------------
  println("=== 2. Row summary statistics ===")
  let row_means = @bio.mg_row_means(mat)
  let row_sums = @bio.mg_row_sums(mat)
  let row_medians = @bio.mg_row_medians(mat)
  let row_mins = @bio.mg_row_mins(mat)
  let row_maxs = @bio.mg_row_maxs(mat)
  let row_vars = @bio.mg_row_vars(mat)
  let row_sds = @bio.mg_row_sds(mat)
  println("Row means:    \{Repr(row_means)}")
  println("Row sums:     \{Repr(row_sums)}")
  println("Row medians:  \{Repr(row_medians)}")
  println("Row mins:     \{Repr(row_mins)}")
  println("Row maxs:     \{Repr(row_maxs)}")
  println("Row vars:     \{Repr(row_vars)}")
  println("Row sds:      \{Repr(row_sds)}")
  println("")

  // ------------------------------------------------------------------
  // 3. Column summary statistics
  // ------------------------------------------------------------------
  println("=== 3. Column summary statistics ===")
  let col_means = @bio.mg_col_means(mat)
  let col_sums = @bio.mg_col_sums(mat)
  let col_medians = @bio.mg_col_medians(mat)
  let col_mins = @bio.mg_col_mins(mat)
  let col_maxs = @bio.mg_col_maxs(mat)
  println("Col means:    \{Repr(col_means)}")
  println("Col sums:     \{Repr(col_sums)}")
  println("Col medians:  \{Repr(col_medians)}")
  println("Col mins:     \{Repr(col_mins)}")
  println("Col maxs:     \{Repr(col_maxs)}")
  println("")

  // ------------------------------------------------------------------
  // 4. Row anys and alls with a threshold
  // ------------------------------------------------------------------
  println("=== 4. Row anys and row_alls (threshold = 5.0) ===")
  let row_anys = @bio.mg_row_anys(mat, 5.0)
  let row_alls = @bio.mg_row_alls(mat, 5.0)
  println("Row anys (>5.0): \{Repr(row_anys)}")
  println("Row alls (>5.0): \{Repr(row_alls)}")
  println("")

  // ------------------------------------------------------------------
  // 5. Block processing with mg_block_apply_rows
  // ------------------------------------------------------------------
  println("=== 5. Block processing (block_size=2, row_means) ===")
  let block_result = @bio.mg_block_apply_rows(mat, 2, block => {
    @bio.mg_row_means(block)
  })
  println("Block-applied row means: \{Repr(block_result)}")
  println("")

  // ------------------------------------------------------------------
  // 6. Standalone statistical functions
  // ------------------------------------------------------------------
  println("=== 6. Standalone statistical functions ===")
  let sample = [3.0, 1.0, 4.0, 1.0, 5.0, 9.0, 2.0, 6.0]
  println("Sample data: \{Repr(sample)}")
  println("Mean:   \{@bio.mg_mean(sample)}")
  println("Median: \{@bio.mg_median(sample)}")
  println("Min:    \{@bio.mg_min(sample)}")
  println("Max:    \{@bio.mg_max(sample)}")
  println("Var:    \{@bio.mg_variance(sample)}")

  println("=== Demo complete ===")
}