{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}

-- |
-- Module      :  Analyze.Analyze
-- Description :  Parse sequence file formats and analyze them
-- Copyright   :  (c) Dominik Schrempf 2021
-- 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.Concatenate.Concatenate
  ( concatenateCmd,
  )
where

import Control.Monad.Trans.Reader
import qualified ELynx.Data.Sequence.Sequence as S
import ELynx.Export.Sequence.Fasta
import ELynx.Tools.ELynx
import ELynx.Tools.Environment
import SLynx.Concatenate.Options
import SLynx.Tools

-- | Concatenate sequences.
concatenateCmd :: ELynx ConcatenateArguments ()
concatenateCmd :: ELynx ConcatenateArguments ()
concatenateCmd = do
  (ConcatenateArguments Alphabet
al [FilePath]
fps) <- (Environment ConcatenateArguments -> ConcatenateArguments)
-> ReaderT
     (Environment ConcatenateArguments) IO ConcatenateArguments
forall (m :: * -> *) r a. Monad m => (r -> a) -> ReaderT r m a
reader Environment ConcatenateArguments -> ConcatenateArguments
forall a. Environment a -> a
localArguments
  [[Sequence]]
sss <- (FilePath
 -> ReaderT (Environment ConcatenateArguments) IO [Sequence])
-> [FilePath]
-> ReaderT (Environment ConcatenateArguments) IO [[Sequence]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Alphabet
-> FilePath
-> ReaderT (Environment ConcatenateArguments) IO [Sequence]
forall e.
(HasLock e, HasLogHandles e, HasVerbosity e) =>
Alphabet -> FilePath -> Logger e [Sequence]
readSeqs Alphabet
al) [FilePath]
fps
  let result :: ByteString
result = [Sequence] -> ByteString
sequencesToFasta ([Sequence] -> ByteString) -> [Sequence] -> ByteString
forall a b. (a -> b) -> a -> b
$ [[Sequence]] -> [Sequence]
S.concatSequences [[Sequence]]
sss
  FilePath -> ByteString -> FilePath -> ELynx ConcatenateArguments ()
forall a.
Reproducible a =>
FilePath -> ByteString -> FilePath -> ELynx a ()
out FilePath
"concatenated multi sequence alignment " ByteString
result FilePath
".fasta"