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

  let motifs = @src.motifstack_sample_motifs()
  println("\n1. Motif collection")
  for m in motifs {
    println("   " + m.name + " (width=" + m.len().to_string() + ")")
  }

  println("\n2. Pairwise distances (1 - Pearson)")
  let dm = @src.motifstack_distance_matrix(motifs)
  for i in 0.. {
      let leaves = root.leaves()
      println("   leaf order: " + repr(leaves))
      println("   merge height: " + root.height().to_string())
    }
    None => println("   no clustering")
  }

  println("\n4. Stacking order (by clustering)")
  let order = @src.motifstack_stack_order(motifs)
  println("   order: " + repr(order))

  println("\n5. Per-column information content")
  for m in motifs {
    let ics = @src.motifstack_column_ic(m)
    let mut line = m.name + ": "
    for ic in ics {
      line = line + ic.to_string() + " "
    }
    println("   " + line)
  }

  println("\n6. ASCII logo for GATA1")
  println(@src.motifstack_ascii_logo(motifs[0], rows=5))

  println("\n7. Stacked logos (clustering order)")
  println(@src.motifstack_stack_ascii(motifs, rows=4))

  println("\n8. Flattened PWM vector")
  let flat = @src.motifstack_flatten(motifs[0])
  println("   " + motifs[0].name + ": " + flat.length().to_string() + " values")

  println("\n9. Node traversal")
  let leaf = @src.MotifStackNode::Leaf(0)
  println("   leaf height: " + leaf.height().to_string())
  println("   leaf leaves: " + repr(leaf.leaves()))
  let merge = @src.MotifStackNode::Merge(
    @src.MotifStackNode::Leaf(0),
    @src.MotifStackNode::Leaf(1),
    0.5,
  )
  println("   merge height: " + merge.height().to_string())
  println("   merge leaves: " + repr(merge.leaves()))
}