///|
/// De Bruijn Graph Demo - Sequence Assembly
///
/// This demo shows how to use the De Bruijn graph for sequence assembly.
fn main {
  println("=== De Bruijn Graph Demo ===")
  println("")

  println("1. Basic graph construction:")
  let graph = @src.DeBruijnGraph::new(3)
  graph.add_sequence("ABCDE")
  println(graph.to_string())
  println("")

  println("2. Single sequence assembly:")
  let seq = "ABCDEFGHIJ"
  println("   Original: " + seq)
  match @src.assemble_single(seq, 4) {
    Some(assembled) => println("   Assembled: " + assembled)
    None => println("   Assembly failed")
  }
  println("")

  println("3. Multiple overlapping reads assembly:")
  let reads = ["ABCDE", "CDEFG", "EFGHI"]
  println("   Reads:")
  for i = 0; i < reads.length(); i = i + 1 {
    println("     " + reads[i])
  }
  match @src.assemble_sequences(reads, 3) {
    Some(assembled) => println("   Assembled: " + assembled)
    None => println("   Assembly failed")
  }
  println("")

  println("4. Graph with branches:")
  let graph2 = @src.DeBruijnGraph::new(3)
  graph2.add_sequence("ABCDE")
  graph2.add_sequence("ABXDE")
  println(graph2.to_string())
  println("")

  println("5. Circular sequence (Eulerian circuit):")
  let circular = "ABCA"
  println("   Original: " + circular)
  let graph3 = @src.DeBruijnGraph::new(3)
  graph3.add_sequence(circular)
  println(graph3.to_string())
  match graph3.find_eulerian_path() {
    Some(path) => println("   Eulerian path: " + path)
    None => println("   No Eulerian path found")
  }
}