///|
/// Bio.Data module example - Biological data constants and utilities.
///
/// Run: moon run examples/data_demo/main.mbt
fn main {
println("=== Bio.Data Module Demo ===")
println("")
// IUPAC ambiguous bases
println("=== IUPAC Ambiguous DNA Bases ===")
let dna_amb = @bio.iupac_ambiguous_dna_map()
println("Total ambiguous bases: \{dna_amb.length()}")
println("R (G/A): \{Repr(dna_amb.get("R").unwrap())}")
println("Y (C/T): \{Repr(dna_amb.get("Y").unwrap())}")
println("N (A/C/G/T): \{Repr(dna_amb.get("N").unwrap())}")
println("")
println("=== IUPAC Ambiguous RNA Bases ===")
let rna_amb = @bio.iupac_ambiguous_rna_map()
println("Total ambiguous bases: \{rna_amb.length()}")
println("Y (C/U): \{Repr(rna_amb.get("Y").unwrap())}")
println("")
// Check if bases are ambiguous
println("=== Ambiguity Checks ===")
println("Is 'R' ambiguous DNA? \{@bio.is_ambiguous_dna("R")}")
println("Is 'A' ambiguous DNA? \{@bio.is_ambiguous_dna("A")}")
println("Is 'N' ambiguous DNA? \{@bio.is_ambiguous_dna("N")}")
println("")
// Expand ambiguous bases
println("=== Expand Ambiguous Bases ===")
println("Expand 'R': \{Repr(@bio.expand_ambiguous_dna("R"))}")
println("Expand 'N': \{Repr(@bio.expand_ambiguous_dna("N"))}")
println("Expand 'A': \{Repr(@bio.expand_ambiguous_dna("A"))}")
println("")
// Amino acid mappings
println("=== Amino Acid 3-to-1 Letter Code ===")
let aa_map = @bio.amino_3_to_1()
println("Total amino acids: \{aa_map.length()}")
println("Ala -> \{aa_map.get("Ala").unwrap()}")
println("Ter -> \{aa_map.get("Ter").unwrap()}")
println("")
println("=== Amino Acid 1-to-3 Letter Code ===")
let aa1to3 = @bio.amino_1_to_3()
println("Total: \{aa1to3.length()}")
println("A -> \{aa1to3.get("A").unwrap()}")
println("* -> \{aa1to3.get("*").unwrap()}")
println("")
// Amino acid lookup
println("=== Direct Amino Acid Lookup ===")
println("amino3_to_1('Ala'): \{@bio.amino3_to_1("Ala")}")
println("amino3_to_1('Ter'): \{@bio.amino3_to_1("Ter")}")
println("amino3_to_1('XXX'): \{@bio.amino3_to_1("XXX")}")
println("amino1_to_3('A'): \{@bio.amino1_to_3("A")}")
println("amino1_to_3('*'): \{@bio.amino1_to_3("*")}")
println("")
// Amino acid properties
println("=== Amino Acid Properties ===")
let ala = @bio.amino_acid_properties("A")
println(
"Ala: property=\{ala.property}, charge=\{ala.charge}, hydropathy=\{ala.hydropathy}",
)
let arg = @bio.amino_acid_properties("R")
println(
"Arg: property=\{arg.property}, charge=\{arg.charge}, hydropathy=\{arg.hydropathy}",
)
let unknown = @bio.amino_acid_properties("X")
println("Unknown: property=\{unknown.property}")
println("")
// Codon table
println("=== Standard Codon Table ===")
let codons = @bio.standard_codon_table()
println("Total codons: \{codons.length()}")
println("ATG (start) -> \{codons.get("ATG").unwrap()}")
println("TAA (stop) -> \{codons.get("TAA").unwrap()}")
println("TAG (stop) -> \{codons.get("TAG").unwrap()}")
println("TGA (stop) -> \{codons.get("TGA").unwrap()}")
println("")
// Codon lookup
println("=== Codon Lookup ===")
println("codon_lookup('ATG'): \{@bio.codon_lookup("ATG")}")
println("codon_lookup('TAA'): \{@bio.codon_lookup("TAA")}")
println("codon_lookup('atg'): \{@bio.codon_lookup("atg")}")
println("codon_lookup('XXX'): \{@bio.codon_lookup("XXX")}")
println("")
// Reverse codon table
println("=== Reverse Codon Table ===")
let rev = @bio.reverse_codon_table()
println("Total amino acids: \{rev.length()}")
println("M (Met) codons: \{Repr(rev.get("M").unwrap())}")
println(
"L (Leu) codons: \{Repr(rev.get("L").unwrap())} (count: \{rev.get("L").unwrap().length()})",
)
println("* (Stop) codons: \{Repr(rev.get("*").unwrap())}")
println("")
// Synonymous codons
println("=== Synonymous Codon Counts ===")
println("M: \{@bio.num_synonymous_codons("M")}")
println("L: \{@bio.num_synonymous_codons("L")}")
println("*: \{@bio.num_synonymous_codons("*")}")
println("X: \{@bio.num_synonymous_codons("X")}")
println("")
// Reverse complement with IUPAC
println("=== IUPAC Reverse Complement ===")
println("ATCG -> \{@bio.reverse_complement_iupac("ATCG")}")
println("R -> \{@bio.reverse_complement_iupac("R")}")
println("Y -> \{@bio.reverse_complement_iupac("Y")}")
println("N -> \{@bio.reverse_complement_iupac("N")}")
println("K -> \{@bio.reverse_complement_iupac("K")}")
println("")
println("=== Done ===")
}