defmodule Bio.Sequence.DnaStrand do @moduledoc """ A single DNA strand can be represented by the basic sequence which uses `Bio.SimpleSequence` . # Examples iex>"tagc" in DnaStrand.new("ttagct") true iex>alias Bio.Enum, as: Bnum ...>DnaStrand.new("ttagct") ...>|> Bnum.map(&(&1)) %DnaStrand{sequence: "ttagct", length: 6} iex>alias Bio.Enum, as: Bnum ...>DnaStrand.new("ttagct") ...>|> Bnum.slice(2, 2) %DnaStrand{sequence: "ag", length: 2, label: ""} In order to validate the sequence of nucleotides, you can pass an alphabet to the `valid?/2` function. """ use Bio.SimpleSequence @impl Bio.Behaviours.Sequence def converter(), do: Bio.Sequence.Dna.Conversions end defimpl Bio.Protocols.Convertible, for: Bio.Sequence.DnaStrand do alias Bio.Sequence.{DnaStrand, RnaStrand} def convert(%DnaStrand{} = sequence, RnaStrand, converter) do sequence |> Enum.map(converter) |> Enum.join("") |> RnaStrand.new(label: sequence.label) end def convert(_, _, _), do: {:error, :undef_conversion} end