{-# LANGUAGE OverloadedStrings #-}

-- |
-- Module      :  Analyze.Analyze
-- Description :  Parse sequence file formats and analyze them
-- Copyright   :  2021 Dominik Schrempf
-- License     :  GPL-3.0-or-later
--
-- Maintainer  :  dominik.schrempf@gmail.com
-- Stability   :  unstable
-- Portability :  portable
--
-- Creation date: Fri Oct  5 08:41:05 2018.
module SLynx.Translate.Translate
  ( translateCmd,
  )
where

import Control.Monad.Trans.Reader
import ELynx.Character.Codon
import ELynx.Sequence.Export.Fasta
import ELynx.Sequence.Sequence
import ELynx.Sequence.Translate
import ELynx.Tools.ELynx
import ELynx.Tools.Environment
import ELynx.Tools.Logger
import SLynx.Tools
import SLynx.Translate.Options

translateSeqs :: Int -> UniversalCode -> [Sequence] -> [Sequence]
translateSeqs :: Int -> UniversalCode -> [Sequence] -> [Sequence]
translateSeqs Int
rf UniversalCode
uc = forall a b. (a -> b) -> [a] -> [b]
map (UniversalCode -> Int -> Sequence -> Sequence
translateSeq UniversalCode
uc Int
rf)

-- | Translate sequences.
translateCmd :: ELynx TranslateArguments ()
translateCmd :: ELynx TranslateArguments ()
translateCmd = do
  (TranslateArguments Alphabet
al String
inFile Int
rf UniversalCode
uc) <- forall a. Environment a -> a
localArguments forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
  forall e.
(HasLock e, HasLogHandles e, HasVerbosity e) =>
String -> Logger e ()
logInfoS forall a b. (a -> b) -> a -> b
$ String
"  Universal code: " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show UniversalCode
uc forall a. Semigroup a => a -> a -> a
<> String
"."
  forall e.
(HasLock e, HasLogHandles e, HasVerbosity e) =>
String -> Logger e ()
logInfoS forall a b. (a -> b) -> a -> b
$ String
"  Reading frame: " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
rf forall a. Semigroup a => a -> a -> a
<> String
"."
  forall e.
(HasLock e, HasLogHandles e, HasVerbosity e) =>
String -> Logger e ()
logInfoS String
""
  [Sequence]
ss <- forall e.
(HasLock e, HasLogHandles e, HasVerbosity e) =>
Alphabet -> String -> Logger e [Sequence]
readSeqs Alphabet
al String
inFile
  let result :: ByteString
result = [Sequence] -> ByteString
sequencesToFasta forall a b. (a -> b) -> a -> b
$ Int -> UniversalCode -> [Sequence] -> [Sequence]
translateSeqs Int
rf UniversalCode
uc [Sequence]
ss
  forall a.
Reproducible a =>
String -> ByteString -> String -> ELynx a ()
out String
"translated sequences" ByteString
result String
"fasta"