{-
# -*- coding: utf-8 -*-
# --------------------------------------------------
# File Name: decode.hs
# Purpose:
# Creation Date: 10-03-2017
# Last Modified: Thu, Mar 23, 2017 9:05:50 PM
# Author(s): Mike Stout
# Copyright 2017 The Author(s) All Rights Reserved
# Credits:
# --------------------------------------------------
-}
import System.Environment
import Utilities
import Data.Maybe
import Data.Char
import Data.List
-- import Text.Regex.PCRE
main = do
{-
let pat = "(foo[a-z]*bar|quux)"
a = "before foodiebar after" =~ pat :: (String,String,String)
let stringResult = "hello there" =~ "e" :: AllTextMatches [] String
a = getAllTextMatches stringResult
print a
-}
interact $ doStuff
doStuff s = unlines $ map show $ proc s
proc s = shw $ map proc1 $ spltAll1 "\n>" s
shw xs = [ a ++ ":\t" ++ b!!i | i<-[0..m-1], (a,b) <- sortBy cmp xs ]
where cmp a b = compare (fst a) (fst b)
m = length $ snd $ head xs
proc1 s = (a', takes 100 $ decode $ concat xs)
where (a:xs) = lines s
a' = (spltAll1 ".html." a)!!0
--asDNA = True
asDNA = False
bases
| asDNA = "ATGC"
-- | otherwise = "KHERDQNPSLAGWTFV"
| otherwise = "ARNDBCEQZGHILKMFPSTWYV"
codons
| asDNA = [ [a,b,c,d] | a <- bases, b <- bases , c <- bases, d <- bases]
| otherwise = [ [a,b] | a <- bases, b <- bases ]
geneticCode = zip codons $ [ 0 .. ]
decode xs = map dec $ takes n xs -- $ fixGaps xs
n = length $ head codons
-- Ensure all gaps are of even length ...
fixGaps [] = []
fixGaps xs = concat $ map fixGaps' $ groupBy cmp xs
where cmp a b = a == b
fixGaps' xs = if head xs=='-' && k/=0 then pad k xs else xs
where k = ((length xs) `mod` n)
pad n xs = (take n $ repeat '-') ++ xs
dec codon = if x==Nothing then '_' else chr $ fromJust x
where x = lookup codon geneticCode