///|
/// GFA module demo - Graph Fragment Assembly format parser and writer.
///
/// Run: moon run examples/gfa_demo
fn main {
println("=== GFA Module Demo ===")
println("Graph Fragment Assembly format for genome assembly graphs")
println("Reference: Li H et al. (2016) Bioinformatics 32:2203-2205")
println("")
// ------------------------------------------------------------------
// 1. Load sample GFA graph
// ------------------------------------------------------------------
println("=== 1. Load sample GFA graph ===")
let graph = @bio.gfa_sample_graph()
println("Loaded sample GFA graph")
println("")
// ------------------------------------------------------------------
// 2. Print graph summary (n_segments, n_links, n_paths)
// ------------------------------------------------------------------
println("=== 2. Graph summary ===")
let n_segments = @bio.gfa_graph_n_segments(graph)
let n_links = @bio.gfa_graph_n_links(graph)
let n_paths = @bio.gfa_graph_n_paths(graph)
println("n_segments: \{n_segments}")
println("n_links: \{n_links}")
println("n_paths: \{n_paths}")
println("")
println("Full summary: \{@bio.gfa_graph_summary(graph)}")
println("")
// ------------------------------------------------------------------
// 3. Show all segments (name, sequence length, tags)
// ------------------------------------------------------------------
println("=== 3. Segments ===")
let segments = graph.segments()
for i in 0.. 0 {
seg_sb.write_string(", ")
}
seg_sb.write_string(seg_list[j])
}
println(" segments: \{seg_sb.to_string()}")
let ov_sb = StringBuilder()
for j in 0.. 0 {
ov_sb.write_string(", ")
}
ov_sb.write_string(overlaps[j])
}
println(" overlaps: \{ov_sb.to_string()}")
}
}
println("")
// ------------------------------------------------------------------
// 6. Convert segments to SeqRecord array and show
// ------------------------------------------------------------------
println("=== 6. Convert segments to SeqRecord array ===")
let records = @bio.gfa_get_segments_as_records(graph)
println("Converted \{records.length()} segment(s) to SeqRecord(s)")
for i in 0.. 0 {
println(" |\{line}")
shown = shown + 1
}
idx = idx + 1
}
println(" ... (total \{n_lines} line(s) in serialized output)")
println("")
// ------------------------------------------------------------------
// 8. Parse a GFA string and verify round-trip
// ------------------------------------------------------------------
println("=== 8. Parse a GFA string and verify round-trip ===")
let gfa_string = "H\tVN:Z:1.0\nS\tquery1\tACGTACGT\tLN:i:8\nS\tquery2\tTTTTGGGG\tLN:i:8\nL\tquery1\t+\tquery2\t-\t4M\nP\tpathA\tquery1+,query2-\t4M,4M\n"
println("Input GFA string:")
println(gfa_string)
let parsed = @bio.gfa_parse(gfa_string)
println("Parsed graph:")
println(" segments: \{@bio.gfa_graph_n_segments(parsed)}")
println(" links: \{@bio.gfa_graph_n_links(parsed)}")
println(" paths: \{@bio.gfa_graph_n_paths(parsed)}")
// Round-trip: serialize the parsed graph and re-parse, then compare counts.
let re_text = @bio.gfa_to_string(parsed)
let re_parsed = @bio.gfa_parse(re_text)
let ok = @bio.gfa_graph_n_segments(re_parsed) ==
@bio.gfa_graph_n_segments(parsed) &&
@bio.gfa_graph_n_links(re_parsed) == @bio.gfa_graph_n_links(parsed) &&
@bio.gfa_graph_n_paths(re_parsed) == @bio.gfa_graph_n_paths(parsed)
println("Round-trip verify: \{ok}")
println("")
println("=== Demo complete ===")
}