{-# LANGUAGE DeriveAnyClass  #-}
{-# LANGUAGE DeriveFunctor   #-}
{-# LANGUAGE TemplateHaskell #-}

module Bio.Protein.AminoAcid.Type where

import           Control.DeepSeq (NFData (..))
import           Control.Lens
import           GHC.Generics    (Generic (..))

-- | Proteinogenic amino acids
--
data AA = ALA -- A
        | CYS -- C
        | ASP -- D
        | GLU -- E
        | PHE -- F
        | GLY -- G
        | HIS -- H
        | ILE -- I
        | LYS -- K
        | LEU -- L
        | MET -- M
        | ASN -- N
        | PRO -- P
        | GLN -- Q
        | ARG -- R
        | SER -- S
        | THR -- T
        | VAL -- V
        | TRP -- W
        | TYR -- Y
  deriving (AA -> AA -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AA -> AA -> Bool
$c/= :: AA -> AA -> Bool
== :: AA -> AA -> Bool
$c== :: AA -> AA -> Bool
Eq, Eq AA
AA -> AA -> Bool
AA -> AA -> Ordering
AA -> AA -> AA
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: AA -> AA -> AA
$cmin :: AA -> AA -> AA
max :: AA -> AA -> AA
$cmax :: AA -> AA -> AA
>= :: AA -> AA -> Bool
$c>= :: AA -> AA -> Bool
> :: AA -> AA -> Bool
$c> :: AA -> AA -> Bool
<= :: AA -> AA -> Bool
$c<= :: AA -> AA -> Bool
< :: AA -> AA -> Bool
$c< :: AA -> AA -> Bool
compare :: AA -> AA -> Ordering
$ccompare :: AA -> AA -> Ordering
Ord, AA
forall a. a -> a -> Bounded a
maxBound :: AA
$cmaxBound :: AA
minBound :: AA
$cminBound :: AA
Bounded, Int -> AA
AA -> Int
AA -> [AA]
AA -> AA
AA -> AA -> [AA]
AA -> AA -> AA -> [AA]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: AA -> AA -> AA -> [AA]
$cenumFromThenTo :: AA -> AA -> AA -> [AA]
enumFromTo :: AA -> AA -> [AA]
$cenumFromTo :: AA -> AA -> [AA]
enumFromThen :: AA -> AA -> [AA]
$cenumFromThen :: AA -> AA -> [AA]
enumFrom :: AA -> [AA]
$cenumFrom :: AA -> [AA]
fromEnum :: AA -> Int
$cfromEnum :: AA -> Int
toEnum :: Int -> AA
$ctoEnum :: Int -> AA
pred :: AA -> AA
$cpred :: AA -> AA
succ :: AA -> AA
$csucc :: AA -> AA
Enum, forall x. Rep AA x -> AA
forall x. AA -> Rep AA x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AA x -> AA
$cfrom :: forall x. AA -> Rep AA x
Generic, AA -> ()
forall a. (a -> ()) -> NFData a
rnf :: AA -> ()
$crnf :: AA -> ()
NFData)

-- | Show full names of amino acids
--
instance Show AA where
    show :: AA -> String
show AA
ALA = String
"Alanine"
    show AA
CYS = String
"Cysteine"
    show AA
ASP = String
"AsparticAcid"
    show AA
GLU = String
"GlutamicAcid"
    show AA
PHE = String
"Phenylalanine"
    show AA
GLY = String
"Glycine"
    show AA
HIS = String
"Histidine"
    show AA
ILE = String
"Isoleucine"
    show AA
LYS = String
"Lysine"
    show AA
LEU = String
"Leucine"
    show AA
MET = String
"Methionine"
    show AA
ASN = String
"Asparagine"
    show AA
PRO = String
"Proline"
    show AA
GLN = String
"Glutamine"
    show AA
ARG = String
"Arginine"
    show AA
SER = String
"Serine"
    show AA
THR = String
"Threonine"
    show AA
VAL = String
"Valine"
    show AA
TRP = String
"Tryptophan"
    show AA
TYR = String
"Tyrosine"

-- | Amino acid structure type
--
data AminoAcid nr car cr a = AminoAcid { forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
AminoAcid nr car cr a -> nr a
_n'  :: nr a
                                       , forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
AminoAcid nr car cr a -> car a
_ca' :: car a
                                       , forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
AminoAcid nr car cr a -> cr a
_c'  :: cr a
                                       }
  deriving (Int -> AminoAcid nr car cr a -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
(Show (nr a), Show (car a), Show (cr a)) =>
Int -> AminoAcid nr car cr a -> ShowS
forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
(Show (nr a), Show (car a), Show (cr a)) =>
[AminoAcid nr car cr a] -> ShowS
forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
(Show (nr a), Show (car a), Show (cr a)) =>
AminoAcid nr car cr a -> String
showList :: [AminoAcid nr car cr a] -> ShowS
$cshowList :: forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
(Show (nr a), Show (car a), Show (cr a)) =>
[AminoAcid nr car cr a] -> ShowS
show :: AminoAcid nr car cr a -> String
$cshow :: forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
(Show (nr a), Show (car a), Show (cr a)) =>
AminoAcid nr car cr a -> String
showsPrec :: Int -> AminoAcid nr car cr a -> ShowS
$cshowsPrec :: forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
(Show (nr a), Show (car a), Show (cr a)) =>
Int -> AminoAcid nr car cr a -> ShowS
Show, AminoAcid nr car cr a -> AminoAcid nr car cr a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
(Eq (nr a), Eq (car a), Eq (cr a)) =>
AminoAcid nr car cr a -> AminoAcid nr car cr a -> Bool
/= :: AminoAcid nr car cr a -> AminoAcid nr car cr a -> Bool
$c/= :: forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
(Eq (nr a), Eq (car a), Eq (cr a)) =>
AminoAcid nr car cr a -> AminoAcid nr car cr a -> Bool
== :: AminoAcid nr car cr a -> AminoAcid nr car cr a -> Bool
$c== :: forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
(Eq (nr a), Eq (car a), Eq (cr a)) =>
AminoAcid nr car cr a -> AminoAcid nr car cr a -> Bool
Eq, forall a b. a -> AminoAcid nr car cr b -> AminoAcid nr car cr a
forall a b.
(a -> b) -> AminoAcid nr car cr a -> AminoAcid nr car cr b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a b.
(Functor nr, Functor car, Functor cr) =>
a -> AminoAcid nr car cr b -> AminoAcid nr car cr a
forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a b.
(Functor nr, Functor car, Functor cr) =>
(a -> b) -> AminoAcid nr car cr a -> AminoAcid nr car cr b
<$ :: forall a b. a -> AminoAcid nr car cr b -> AminoAcid nr car cr a
$c<$ :: forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a b.
(Functor nr, Functor car, Functor cr) =>
a -> AminoAcid nr car cr b -> AminoAcid nr car cr a
fmap :: forall a b.
(a -> b) -> AminoAcid nr car cr a -> AminoAcid nr car cr b
$cfmap :: forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a b.
(Functor nr, Functor car, Functor cr) =>
(a -> b) -> AminoAcid nr car cr a -> AminoAcid nr car cr b
Functor, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a x.
Rep (AminoAcid nr car cr a) x -> AminoAcid nr car cr a
forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a x.
AminoAcid nr car cr a -> Rep (AminoAcid nr car cr a) x
$cto :: forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a x.
Rep (AminoAcid nr car cr a) x -> AminoAcid nr car cr a
$cfrom :: forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a x.
AminoAcid nr car cr a -> Rep (AminoAcid nr car cr a) x
Generic, forall a. (a -> ()) -> NFData a
forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
(NFData (nr a), NFData (car a), NFData (cr a)) =>
AminoAcid nr car cr a -> ()
rnf :: AminoAcid nr car cr a -> ()
$crnf :: forall (nr :: * -> *) (car :: * -> *) (cr :: * -> *) a.
(NFData (nr a), NFData (car a), NFData (cr a)) =>
AminoAcid nr car cr a -> ()
NFData)

-- | Radical structure type
--
data Radical a = Alanine          --  no chi
                   { forall a. Radical a -> a
_cb  :: a    --  -CB
                   }              --
               | Cysteine         --
                   { _cb :: a    --  -CB-SG
                   , forall a. Radical a -> a
_sg :: a    --
                   }              --
               | AsparticAcid     --
                   { _cb  :: a    --  -CB-CG-OD1
                   , forall a. Radical a -> a
_cg  :: a    --       |
                   , forall a. Radical a -> a
_od1 :: a    --       OD2
                   , forall a. Radical a -> a
_od2 :: a    --
                   }              --
               | GlutamicAcid     --
                   { _cb  :: a    --  -CB-CG-CD-OE1
                   , _cg  :: a    --          |
                   , forall a. Radical a -> a
_cd  :: a    --          OE2
                   , forall a. Radical a -> a
_oe1 :: a    --
                   , forall a. Radical a -> a
_oe2 :: a    --
                   }              --
               | Phenylalanine    --
                   { _cb  :: a    --  -CB-CG-CD1-CE1
                   , _cg  :: a    --       |       |
                   , forall a. Radical a -> a
_cd1 :: a    --       CD2-CE2-CZ
                   , forall a. Radical a -> a
_cd2 :: a    --
                   , forall a. Radical a -> a
_ce1 :: a    --
                   , forall a. Radical a -> a
_ce2 :: a    --
                   , forall a. Radical a -> a
_cz  :: a    --
                   }              --
               | Glycine          --
               | Histidine        --
                   { _cb  :: a    --  -CB-CG-ND1-CE1
                   , _cg  :: a    --       |
                   , forall a. Radical a -> a
_nd1 :: a    --       CD2-NE2
                   , _cd2 :: a    --
                   , _ce1 :: a    --
                   , forall a. Radical a -> a
_ne2 :: a    --
                   }              --
               | Isoleucine       --
                   { _cb  :: a    --  -CB-CG1-CD1
                   , forall a. Radical a -> a
_cg1 :: a    --    |
                   , forall a. Radical a -> a
_cg2 :: a    --    CG2
                   , _cd1 :: a    --
                   }              --
               | Lysine           --
                   { _cb :: a    --  -CB-CG-CD-CE-NZ
                   , _cg :: a    --
                   , _cd :: a    --
                   , forall a. Radical a -> a
_ce :: a    --
                   , forall a. Radical a -> a
_nz :: a    --
                   }              --
               | Leucine          --
                   { _cb  :: a    --  -CB-CG-CD1
                   , _cg  :: a    --       |
                   , _cd1 :: a    --       CD2
                   , _cd2 :: a    --
                   }              --
               | Methionine       --
                   { _cb :: a    --  -CB-CG-SD-CE
                   , _cg :: a    --
                   , forall a. Radical a -> a
_sd :: a    --
                   , _ce :: a    --
                   }              --
               | Asparagine       --
                   { _cb  :: a    --  -CB-CG-OD1
                   , _cg  :: a    --       |
                   , _od1 :: a    --       ND2
                   , forall a. Radical a -> a
_nd2 :: a    --
                   }              --
               | Proline          --
                   { _cb :: a    --  -CB-CG-CD(-N)
                   , _cg :: a    --
                   , _cd :: a    --
                   }              --
               | Glutamine        --
                   { _cb  :: a    --  -CB-CG-CD-OE1
                   , _cg  :: a    --          |
                   , _cd  :: a    --          NE2
                   , _oe1 :: a    --
                   , _ne2 :: a    --
                   }              --
               | Arginine         --
                   { _cb  :: a    --  -CB-CG-CD-NE-CZ-NH1
                   , _cg  :: a    --                |
                   , _cd  :: a    --                NH2
                   , forall a. Radical a -> a
_ne  :: a    --
                   , _cz  :: a    --
                   , forall a. Radical a -> a
_nh1 :: a    --
                   , forall a. Radical a -> a
_nh2 :: a    --
                   }              --
               | Serine           --
                   { _cb :: a    --  -CB-OG
                   , forall a. Radical a -> a
_og :: a    --
                   }              --
               | Threonine        --
                   { _cb  :: a    --  -CB-OG1
                   , forall a. Radical a -> a
_og1 :: a    --    |
                   , _cg2 :: a    --    CG2
                   }              --
               | Valine           --
                   { _cb  :: a    --  -CB-CG1
                   , _cg1 :: a    --    |
                   , _cg2 :: a    --    CG2
                   }              --
               | Tryptophan       --
                   { _cb  :: a    --  -CB-CG-CD1-NE1
                   , _cg  :: a    --       |     |
                   , _cd1 :: a    --       CD2-CE2-CZ2
                   , _cd2 :: a    --       |        |
                   , forall a. Radical a -> a
_ne1 :: a    --       CE3-CZ3-CH2
                   , _ce2 :: a    --
                   , forall a. Radical a -> a
_ce3 :: a    --
                   , forall a. Radical a -> a
_cz2 :: a    --
                   , forall a. Radical a -> a
_cz3 :: a    --
                   , forall a. Radical a -> a
_ch2 :: a    --
                   }              --
               | Tyrosine         --
                   { _cb  :: a    --  -CB-CG-CD1-CE1
                   , _cg  :: a    --       |       |
                   , _cd1 :: a    --       CD2-CE2-CZ-OH
                   , _cd2 :: a    --
                   , _ce1 :: a    --
                   , _ce2 :: a    --
                   , _cz  :: a    --
                   , forall a. Radical a -> a
_oh  :: a    --
                   }              --
                     deriving (Int -> Radical a -> ShowS
forall a. Show a => Int -> Radical a -> ShowS
forall a. Show a => [Radical a] -> ShowS
forall a. Show a => Radical a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Radical a] -> ShowS
$cshowList :: forall a. Show a => [Radical a] -> ShowS
show :: Radical a -> String
$cshow :: forall a. Show a => Radical a -> String
showsPrec :: Int -> Radical a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Radical a -> ShowS
Show, Radical a -> Radical a -> Bool
forall a. Eq a => Radical a -> Radical a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Radical a -> Radical a -> Bool
$c/= :: forall a. Eq a => Radical a -> Radical a -> Bool
== :: Radical a -> Radical a -> Bool
$c== :: forall a. Eq a => Radical a -> Radical a -> Bool
Eq, forall a b. a -> Radical b -> Radical a
forall a b. (a -> b) -> Radical a -> Radical b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Radical b -> Radical a
$c<$ :: forall a b. a -> Radical b -> Radical a
fmap :: forall a b. (a -> b) -> Radical a -> Radical b
$cfmap :: forall a b. (a -> b) -> Radical a -> Radical b
Functor, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Radical a) x -> Radical a
forall a x. Radical a -> Rep (Radical a) x
$cto :: forall a x. Rep (Radical a) x -> Radical a
$cfrom :: forall a x. Radical a -> Rep (Radical a) x
Generic, forall a. NFData a => Radical a -> ()
forall a. (a -> ()) -> NFData a
rnf :: Radical a -> ()
$crnf :: forall a. NFData a => Radical a -> ()
NFData)

-- | Atom environment, e.g. hydrogens or radicals
--
data Env r a = Env { forall (r :: * -> *) a. Env r a -> a
_atom'       :: a
                   , forall (r :: * -> *) a. Env r a -> r a
_environment :: r a
                   }
  deriving (Int -> Env r a -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (r :: * -> *) a.
(Show a, Show (r a)) =>
Int -> Env r a -> ShowS
forall (r :: * -> *) a. (Show a, Show (r a)) => [Env r a] -> ShowS
forall (r :: * -> *) a. (Show a, Show (r a)) => Env r a -> String
showList :: [Env r a] -> ShowS
$cshowList :: forall (r :: * -> *) a. (Show a, Show (r a)) => [Env r a] -> ShowS
show :: Env r a -> String
$cshow :: forall (r :: * -> *) a. (Show a, Show (r a)) => Env r a -> String
showsPrec :: Int -> Env r a -> ShowS
$cshowsPrec :: forall (r :: * -> *) a.
(Show a, Show (r a)) =>
Int -> Env r a -> ShowS
Show, Env r a -> Env r a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (r :: * -> *) a.
(Eq a, Eq (r a)) =>
Env r a -> Env r a -> Bool
/= :: Env r a -> Env r a -> Bool
$c/= :: forall (r :: * -> *) a.
(Eq a, Eq (r a)) =>
Env r a -> Env r a -> Bool
== :: Env r a -> Env r a -> Bool
$c== :: forall (r :: * -> *) a.
(Eq a, Eq (r a)) =>
Env r a -> Env r a -> Bool
Eq, forall a b. a -> Env r b -> Env r a
forall a b. (a -> b) -> Env r a -> Env r b
forall (r :: * -> *) a b. Functor r => a -> Env r b -> Env r a
forall (r :: * -> *) a b.
Functor r =>
(a -> b) -> Env r a -> Env r b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Env r b -> Env r a
$c<$ :: forall (r :: * -> *) a b. Functor r => a -> Env r b -> Env r a
fmap :: forall a b. (a -> b) -> Env r a -> Env r b
$cfmap :: forall (r :: * -> *) a b.
Functor r =>
(a -> b) -> Env r a -> Env r b
Functor, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (r :: * -> *) a x. Rep (Env r a) x -> Env r a
forall (r :: * -> *) a x. Env r a -> Rep (Env r a) x
$cto :: forall (r :: * -> *) a x. Rep (Env r a) x -> Env r a
$cfrom :: forall (r :: * -> *) a x. Env r a -> Rep (Env r a) x
Generic, forall a. (a -> ()) -> NFData a
forall (r :: * -> *) a. (NFData a, NFData (r a)) => Env r a -> ()
rnf :: Env r a -> ()
$crnf :: forall (r :: * -> *) a. (NFData a, NFData (r a)) => Env r a -> ()
NFData)

-- | Hydrogens envrironment
--
type H a = Env [] a

-- | Oxigen and hydroxi group, connected to C-terminal of amino acid
--
data OXT a = OXT { forall a. OXT a -> a
_o'   :: a
                 , forall a. OXT a -> a
_oxt' :: a
                 }
  deriving (Int -> OXT a -> ShowS
forall a. Show a => Int -> OXT a -> ShowS
forall a. Show a => [OXT a] -> ShowS
forall a. Show a => OXT a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OXT a] -> ShowS
$cshowList :: forall a. Show a => [OXT a] -> ShowS
show :: OXT a -> String
$cshow :: forall a. Show a => OXT a -> String
showsPrec :: Int -> OXT a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> OXT a -> ShowS
Show, OXT a -> OXT a -> Bool
forall a. Eq a => OXT a -> OXT a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OXT a -> OXT a -> Bool
$c/= :: forall a. Eq a => OXT a -> OXT a -> Bool
== :: OXT a -> OXT a -> Bool
$c== :: forall a. Eq a => OXT a -> OXT a -> Bool
Eq, forall a b. a -> OXT b -> OXT a
forall a b. (a -> b) -> OXT a -> OXT b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> OXT b -> OXT a
$c<$ :: forall a b. a -> OXT b -> OXT a
fmap :: forall a b. (a -> b) -> OXT a -> OXT b
$cfmap :: forall a b. (a -> b) -> OXT a -> OXT b
Functor, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (OXT a) x -> OXT a
forall a x. OXT a -> Rep (OXT a) x
$cto :: forall a x. Rep (OXT a) x -> OXT a
$cfrom :: forall a x. OXT a -> Rep (OXT a) x
Generic, forall a. NFData a => OXT a -> ()
forall a. (a -> ()) -> NFData a
rnf :: OXT a -> ()
$crnf :: forall a. NFData a => OXT a -> ()
NFData)

-- | CG atom with radical type
--
data CG a = CG { forall a. CG a -> a
_cg'      :: a
               , forall a. CG a -> AA
_radical' :: AA
               }
  deriving (Int -> CG a -> ShowS
forall a. Show a => Int -> CG a -> ShowS
forall a. Show a => [CG a] -> ShowS
forall a. Show a => CG a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CG a] -> ShowS
$cshowList :: forall a. Show a => [CG a] -> ShowS
show :: CG a -> String
$cshow :: forall a. Show a => CG a -> String
showsPrec :: Int -> CG a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> CG a -> ShowS
Show, CG a -> CG a -> Bool
forall a. Eq a => CG a -> CG a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CG a -> CG a -> Bool
$c/= :: forall a. Eq a => CG a -> CG a -> Bool
== :: CG a -> CG a -> Bool
$c== :: forall a. Eq a => CG a -> CG a -> Bool
Eq, forall a b. a -> CG b -> CG a
forall a b. (a -> b) -> CG a -> CG b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> CG b -> CG a
$c<$ :: forall a b. a -> CG b -> CG a
fmap :: forall a b. (a -> b) -> CG a -> CG b
$cfmap :: forall a b. (a -> b) -> CG a -> CG b
Functor, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (CG a) x -> CG a
forall a x. CG a -> Rep (CG a) x
$cto :: forall a x. Rep (CG a) x -> CG a
$cfrom :: forall a x. CG a -> Rep (CG a) x
Generic, forall a. NFData a => CG a -> ()
forall a. (a -> ()) -> NFData a
rnf :: CG a -> ()
$crnf :: forall a. NFData a => CG a -> ()
NFData)

makeLenses ''AminoAcid
makeLenses ''Radical
makeLenses ''Env
makeLenses ''OXT
makeLenses ''CG

-- | BackBone
--
type BB a      = AminoAcid Identity   Identity                  Identity       (Identity a)

-- | BackBone CA-only
--
type BBCA a    = AminoAcid (Const ()) Identity                  (Const ())     (Identity a)

-- | BackBone with radical Type
--
type BBT a     = AminoAcid Identity   (Env (Const AA))          Identity       (Identity a)

-- | BackBone CA-only with radical Type
--
type BBCAT a   = AminoAcid (Const ()) (Env (Const AA))          (Const ())     (Identity a)

-- | BackBone with CG-radical
--
type BBCG a    = AminoAcid Identity   (Env CG)                  Identity       (Identity a)

-- | BackBone with Oxigen
--
type BBO a     = AminoAcid Identity    Identity                 (Env Identity) (Identity a)

-- | BackBone with Oxigen and radical Type
--
type BBOT a    = AminoAcid Identity    (Env (Const AA))         (Env Identity) (Identity a)

-- | BackBone with Oxigen and CG-radical
--
type BBOCG a   = AminoAcid Identity    (Env CG)                 (Env Identity) (Identity a)

-- | BackBone with Oxigen and Radical
--
type BBOR a    = AminoAcid Identity    (Env Radical)            (Env Identity) (Identity a)

-- | BackBone with Oxigen, oXigen Two and Radical
--
type BBOXTR a  = AminoAcid Identity    (Env Radical)            (Env OXT)      (Identity a)

-- | BackBone with Oxigen, Radical and Hydrogens
--
type BBORH a   = AminoAcid Identity    (Env Radical)            (Env Identity) (H a)

-- | BackBone with Oxigen, oXigen Two, Radical and Hydrogens
--
type BBOXTRH a = AminoAcid Identity    (Env Radical)            (Env OXT)      (H a)
--
-- | Convert radical to radical name
--
rad2rad :: Radical a -> AA
rad2rad :: forall a. Radical a -> AA
rad2rad Alanine{}       = AA
ALA
rad2rad Cysteine{}      = AA
CYS
rad2rad AsparticAcid{}  = AA
ASP
rad2rad GlutamicAcid{}  = AA
GLU
rad2rad Phenylalanine{} = AA
PHE
rad2rad Radical a
Glycine         = AA
GLY
rad2rad Histidine{}     = AA
HIS
rad2rad Isoleucine{}    = AA
ILE
rad2rad Lysine{}        = AA
LYS
rad2rad Leucine{}       = AA
LEU
rad2rad Methionine{}    = AA
MET
rad2rad Asparagine{}    = AA
ASN
rad2rad Proline{}       = AA
PRO
rad2rad Glutamine{}     = AA
GLN
rad2rad Arginine{}      = AA
ARG
rad2rad Serine{}        = AA
SER
rad2rad Threonine{}     = AA
THR
rad2rad Valine{}        = AA
VAL
rad2rad Tryptophan{}    = AA
TRP
rad2rad Tyrosine{}      = AA
TYR