defmodule Bio.Sequence.MonomerName do
@moduledoc """
Get the full name for a given monomer.
# Example
iex>MonomerName.nucleic_acid("a")
"adenine"
iex>MonomerName.amino_acid("a")
"alanine"
"""
@dna_names %{
"a" => "adenine",
"c" => "cytosine",
"g" => "guanine",
"t" => "thymine"
}
@rna_names Map.merge(@dna_names, %{"u" => "uracil"})
@amino_names %{
"a" => "alanine",
"r" => "arginine",
"n" => "asparagine",
"d" => "aspartic acid",
"c" => "cysteine",
"q" => "glutamine",
"e" => "glutamic acid",
"g" => "glycine",
"h" => "histidine",
"i" => "isoleucine",
"l" => "leucine",
"k" => "lysine",
"m" => "methionine",
"f" => "phenylalanine",
"p" => "proline",
"o" => "pyrrolysine",
"s" => "serine",
"u" => "selenocysteine",
"t" => "threonine",
"w" => "tryptophan",
"y" => "tyrosine",
"v" => "valine",
"b" => "aspartic acid or asparagine",
"z" => "glutamic acid or glutamine",
"j" => "leucine or isoleucine",
"x" => "any amino acid"
}
@doc """
Mapping nucleotides to their chemical names
## Example
iex>MonomerName.nucleic_acid("a")
"adenine"
"""
def nucleic_acid(value) do
get(value, @rna_names)
end
@doc """
Mapping amino acids to their chemical names
## Example
iex>MonomerName.nucleic_acid("a")
"adenine"
"""
def amino_acid(value) do
get(value, @amino_names)
end
defp get(value, map) do
value
|> String.downcase()
|> then(&Map.get(map, &1))
end
end