module Biobase.Primary.Trans where
import Control.Arrow ((***))
import Data.ByteString.Char8 (ByteString,unpack)
import Data.FileEmbed (embedFile)
import Data.Map.Strict (Map)
import Data.Tuple (swap)
import qualified Data.Map.Strict as M
import qualified Data.Vector.Unboxed as VU
import Biobase.Primary.AA
import Biobase.Primary.Nuc
import Biobase.Primary.Letter
dnaAAseq :: Primary DNA -> Primary AA
dnaAAseq = VU.fromList . go where
go (VU.length -> 0) = []
go (VU.splitAt 3 -> (hs,ts)) = case M.lookup hs dnaAAmap of
Just aa -> aa : go ts
_ -> error $ "dnaAAseq: " ++ show (hs,ts)
aaDNAseq :: Primary AA -> Primary DNA
aaDNAseq = VU.concatMap go where
go aa = case M.lookup aa aaDNAmap of
Just codon -> codon
Nothing -> error $ "aaDNAseq" ++ show aa
aaDNAmap :: M.Map (Letter AA) (Primary DNA)
aaDNAmap = M.fromList . map swap . M.assocs $ dnaAAmap
dnaAAmap :: Map (Primary DNA) (Letter AA)
dnaAAmap = M.fromList . map (primary *** charAA) . M.assocs $ codonTable where
codonTable :: Map String Char
codonTable = M.fromList . map (go . words) . lines . unpack $ codonListEmbedded where
go [cs,[c]] = (cs,c)
go e = error $ "codonTable:" ++ show e
codonListEmbedded :: ByteString
codonListEmbedded = $(embedFile "sources/codontable")