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

module Bio.Protein.Chain
  ( module C
  , ProteinChain(..)
  ) where

import           Bio.Chain             as C
import           Bio.Protein.AminoAcid
import           Control.Lens
import           Data.Array            (Ix (..))
import           Data.String           (IsString (..))

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

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

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

instance IsString (ProteinChain Int AA) where
  fromString = ProteinChain . fromString