{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DeriveAnyClass #-}
module Bio.Protein.AminoAcid.Type where
import Control.DeepSeq (NFData (..))
import Control.Lens
import Control.Monad.Identity (Identity)
import GHC.Generics (Generic (..))
data AA = ALA
| CYS
| ASP
| GLU
| PHE
| GLY
| HIS
| ILE
| LYS
| LEU
| MET
| ASN
| PRO
| GLN
| ARG
| SER
| THR
| VAL
| TRP
| TYR
deriving (Eq, Ord, Bounded, Enum, Generic, NFData)
instance Show AA where
show ALA = "Alanine"
show CYS = "Cysteine"
show ASP = "AsparticAcid"
show GLU = "GlutamicAcid"
show PHE = "Phenylalanine"
show GLY = "Glycine"
show HIS = "Histidine"
show ILE = "Isoleucine"
show LYS = "Lysine"
show LEU = "Leucine"
show MET = "Methionine"
show ASN = "Asparagine"
show PRO = "Proline"
show GLN = "Glutamine"
show ARG = "Arginine"
show SER = "Serine"
show THR = "Threonine"
show VAL = "Valine"
show TRP = "Tryptophan"
show TYR = "Tyrosine"
data AminoAcid nr car cr a = AminoAcid { _n' :: nr a
, _ca' :: car a
, _c' :: cr a
}
deriving (Show, Eq, Functor, Generic, NFData)
data Radical a = Alanine
{ _cb :: a
}
| Cysteine
{ _cb :: a
, _sg :: a
}
| AsparticAcid
{ _cb :: a
, _cg :: a
, _od1 :: a
, _od2 :: a
}
| GlutamicAcid
{ _cb :: a
, _cg :: a
, _cd :: a
, _oe1 :: a
, _oe2 :: a
}
| Phenylalanine
{ _cb :: a
, _cg :: a
, _cd1 :: a
, _cd2 :: a
, _ce1 :: a
, _ce2 :: a
, _cz :: a
}
| Glycine
| Histidine
{ _cb :: a
, _cg :: a
, _nd1 :: a
, _cd2 :: a
, _ce1 :: a
, _ne2 :: a
}
| Isoleucine
{ _cb :: a
, _cg1 :: a
, _cg2 :: a
, _cd1 :: a
}
| Lysine
{ _cb :: a
, _cg :: a
, _cd :: a
, _ce :: a
, _nz :: a
}
| Leucine
{ _cb :: a
, _cg :: a
, _cd1 :: a
, _cd2 :: a
}
| Methionine
{ _cb :: a
, _cg :: a
, _sd :: a
, _ce :: a
}
| Asparagine
{ _cb :: a
, _cg :: a
, _od1 :: a
, _nd2 :: a
}
| Proline
{ _cb :: a
, _cg :: a
, _cd :: a
}
| Glutamine
{ _cb :: a
, _cg :: a
, _cd :: a
, _oe1 :: a
, _ne2 :: a
}
| Arginine
{ _cb :: a
, _cg :: a
, _cd :: a
, _ne :: a
, _cz :: a
, _nh1 :: a
, _nh2 :: a
}
| Serine
{ _cb :: a
, _og :: a
}
| Threonine
{ _cb :: a
, _og1 :: a
, _cg2 :: a
}
| Valine
{ _cb :: a
, _cg1 :: a
, _cg2 :: a
}
| Tryptophan
{ _cb :: a
, _cg :: a
, _cd1 :: a
, _cd2 :: a
, _ne1 :: a
, _ce2 :: a
, _ce3 :: a
, _cz2 :: a
, _cz3 :: a
, _ch2 :: a
}
| Tyrosine
{ _cb :: a
, _cg :: a
, _cd1 :: a
, _cd2 :: a
, _ce1 :: a
, _ce2 :: a
, _cz :: a
, _oh :: a
}
deriving (Show, Eq, Functor, Generic, NFData)
data Env r a = Env { _atom' :: a
, _environment :: r a
}
deriving (Show, Eq, Functor, Generic, NFData)
type H a = Env [] a
data OXT a = OXT { _o' :: a
, _oxt' :: a
}
deriving (Show, Eq, Functor, Generic, NFData)
data CG a = CG { _cg' :: a
, _radical' :: AA
}
deriving (Show, Eq, Functor, Generic, NFData)
makeLenses ''AminoAcid
makeLenses ''Radical
makeLenses ''Env
makeLenses ''OXT
makeLenses ''CG
type BB a = AminoAcid Identity Identity Identity (Identity a)
type BBCA a = AminoAcid (Const ()) Identity (Const ()) (Identity a)
type BBT a = AminoAcid Identity (Env (Const AA)) Identity (Identity a)
type BBCAT a = AminoAcid (Const ()) (Env (Const AA)) (Const ()) (Identity a)
type BBCG a = AminoAcid Identity (Env CG) Identity (Identity a)
type BBO a = AminoAcid Identity Identity (Env Identity) (Identity a)
type BBOT a = AminoAcid Identity (Env (Const AA)) (Env Identity) (Identity a)
type BBOCG a = AminoAcid Identity (Env CG) (Env Identity) (Identity a)
type BBOR a = AminoAcid Identity (Env Radical) (Env Identity) (Identity a)
type BBOXTR a = AminoAcid Identity (Env Radical) (Env OXT) (Identity a)
type BBORH a = AminoAcid Identity (Env Radical) (Env Identity) (H a)
type BBOXTRH a = AminoAcid Identity (Env Radical) (Env OXT) (H a)
rad2rad :: Radical a -> AA
rad2rad Alanine{} = ALA
rad2rad Cysteine{} = CYS
rad2rad AsparticAcid{} = ASP
rad2rad GlutamicAcid{} = GLU
rad2rad Phenylalanine{} = PHE
rad2rad Glycine = GLY
rad2rad Histidine{} = HIS
rad2rad Isoleucine{} = ILE
rad2rad Lysine{} = LYS
rad2rad Leucine{} = LEU
rad2rad Methionine{} = MET
rad2rad Asparagine{} = ASN
rad2rad Proline{} = PRO
rad2rad Glutamine{} = GLN
rad2rad Arginine{} = ARG
rad2rad Serine{} = SER
rad2rad Threonine{} = THR
rad2rad Valine{} = VAL
rad2rad Tryptophan{} = TRP
rad2rad Tyrosine{} = TYR