-- |

module Biobase.GeneticCodes.Types where

import Control.Lens
import Data.ByteString.Char8 (ByteString)
import Data.Map.Strict (Map,fromList,fromListWith)
import Data.Text (Text)

import Biobase.Types.Codon



data TranslationElement c a = TranslationElement
  { TranslationElement c a -> Codon c
_baseCodon    :: !(Codon c)
  , TranslationElement c a -> Bool
_isStartCodon :: !Bool
  , TranslationElement c a -> a
_aminoAcid    :: !a
  }
  deriving (Int -> TranslationElement c a -> ShowS
[TranslationElement c a] -> ShowS
TranslationElement c a -> String
(Int -> TranslationElement c a -> ShowS)
-> (TranslationElement c a -> String)
-> ([TranslationElement c a] -> ShowS)
-> Show (TranslationElement c a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall c a.
(Show c, Show a) =>
Int -> TranslationElement c a -> ShowS
forall c a. (Show c, Show a) => [TranslationElement c a] -> ShowS
forall c a. (Show c, Show a) => TranslationElement c a -> String
showList :: [TranslationElement c a] -> ShowS
$cshowList :: forall c a. (Show c, Show a) => [TranslationElement c a] -> ShowS
show :: TranslationElement c a -> String
$cshow :: forall c a. (Show c, Show a) => TranslationElement c a -> String
showsPrec :: Int -> TranslationElement c a -> ShowS
$cshowsPrec :: forall c a.
(Show c, Show a) =>
Int -> TranslationElement c a -> ShowS
Show)
makeLenses ''TranslationElement

data TranslationTable c a = TranslationTable
  { TranslationTable c a -> Map (Codon c) (TranslationElement c a)
_codonToAminoAcid  :: !(Map (Codon c) (TranslationElement c a))
  , TranslationTable c a -> Map a [TranslationElement c a]
_aminoAcidtoCodons :: !(Map a [TranslationElement c a])
  , TranslationTable c a -> Int
_tableID           :: !Int
  , TranslationTable c a -> Text
_tableName         :: !Text
  }
  deriving (Int -> TranslationTable c a -> ShowS
[TranslationTable c a] -> ShowS
TranslationTable c a -> String
(Int -> TranslationTable c a -> ShowS)
-> (TranslationTable c a -> String)
-> ([TranslationTable c a] -> ShowS)
-> Show (TranslationTable c a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall c a.
(Show c, Show a) =>
Int -> TranslationTable c a -> ShowS
forall c a. (Show c, Show a) => [TranslationTable c a] -> ShowS
forall c a. (Show c, Show a) => TranslationTable c a -> String
showList :: [TranslationTable c a] -> ShowS
$cshowList :: forall c a. (Show c, Show a) => [TranslationTable c a] -> ShowS
show :: TranslationTable c a -> String
$cshow :: forall c a. (Show c, Show a) => TranslationTable c a -> String
showsPrec :: Int -> TranslationTable c a -> ShowS
$cshowsPrec :: forall c a.
(Show c, Show a) =>
Int -> TranslationTable c a -> ShowS
Show)
makeLenses ''TranslationTable

genTranslationTable
  :: (Ord c, Ord a)
  => Int
  -- ^ table identifier
  -> Text
  -- ^ table hdr / table name
  -> [TranslationElement c a]
  -- ^ known translation elements (should be @4^3@ but is not checked)
  -> TranslationTable c a
  -- ^ finished translation table
{-# Inlinable genTranslationTable #-}
genTranslationTable :: Int -> Text -> [TranslationElement c a] -> TranslationTable c a
genTranslationTable Int
i Text
hdr [TranslationElement c a]
xs = TranslationTable :: forall c a.
Map (Codon c) (TranslationElement c a)
-> Map a [TranslationElement c a]
-> Int
-> Text
-> TranslationTable c a
TranslationTable
  { _codonToAminoAcid :: Map (Codon c) (TranslationElement c a)
_codonToAminoAcid  = [(Codon c, TranslationElement c a)]
-> Map (Codon c) (TranslationElement c a)
forall k a. Ord k => [(k, a)] -> Map k a
fromList [ (TranslationElement c a
tTranslationElement c a
-> Getting (Codon c) (TranslationElement c a) (Codon c) -> Codon c
forall s a. s -> Getting a s a -> a
^.Getting (Codon c) (TranslationElement c a) (Codon c)
forall c a c.
Lens
  (TranslationElement c a)
  (TranslationElement c a)
  (Codon c)
  (Codon c)
baseCodon, TranslationElement c a
t) | TranslationElement c a
t  [TranslationElement c a]
xs ]
  , _aminoAcidtoCodons :: Map a [TranslationElement c a]
_aminoAcidtoCodons = ([TranslationElement c a]
 -> [TranslationElement c a] -> [TranslationElement c a])
-> [(a, [TranslationElement c a])]
-> Map a [TranslationElement c a]
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
fromListWith [TranslationElement c a]
-> [TranslationElement c a] -> [TranslationElement c a]
forall a. [a] -> [a] -> [a]
(++) [ (TranslationElement c a
tTranslationElement c a -> Getting a (TranslationElement c a) a -> a
forall s a. s -> Getting a s a -> a
^.Getting a (TranslationElement c a) a
forall c a a.
Lens (TranslationElement c a) (TranslationElement c a) a a
aminoAcid, [TranslationElement c a
t]) | TranslationElement c a
t  [TranslationElement c a]
xs ]
  , _tableID :: Int
_tableID           = Int
i
  , _tableName :: Text
_tableName         = Text
hdr
  }