{-# OPTIONS_GHC -fno-warn-orphans #-}

module Bio.NucleicAcid.Chain where

import           Bio.Chain                  as C
import           Bio.NucleicAcid.Nucleotide
import           Control.Lens
import           Data.Array                 (Ix (..))
import           Data.String                (IsString (..))

newtype NucleicAcidChain i a = NucleicAcidChain { getChain :: Chain i a }
  deriving (Show, Eq, Functor, Foldable, Traversable, ChainLike)

type instance Index (NucleicAcidChain i a) = i
type instance IxValue (NucleicAcidChain i a) = a

instance Ix i => Ixed (NucleicAcidChain i a) where
    ix i' = coerced . ix @(Chain i a) i'

instance IsString (NucleicAcidChain Int DNA) where
  fromString = NucleicAcidChain . fromString

instance IsString (NucleicAcidChain Int RNA) where
  fromString = NucleicAcidChain . fromString