lib/sequence/dna/dna_strand.ex

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