-- |
-- Module      :  ELynx.Export.Sequence.Fasta
-- Description :  Export Fasta sequences
-- Copyright   :  (c) Dominik Schrempf 2018
-- License     :  GPL-3.0-or-later
--
--
-- Maintainer  :  dominik.schrempf@gmail.com
-- Stability   :  unstable
-- Portability :  portable
--
-- Write FASTA files.
--
-- [NCBI file specifications](https://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Web&PAGE_TYPE=BlastDocs&DOC_TYPE=BlastHelp).
module ELynx.Export.Sequence.Fasta
  ( sequenceToFasta,
    sequencesToFasta,
  )
where

import qualified Data.ByteString.Lazy.Char8 as BL
import ELynx.Data.Sequence.Sequence

fastaHeader :: BL.ByteString -> BL.ByteString -> BL.ByteString
fastaHeader n d =
  BL.singleton '>' <> n <> if BL.null d then BL.empty else BL.pack " " <> d

-- | Convert a 'Sequence' to Fasta format.
sequenceToFasta :: Sequence -> BL.ByteString
sequenceToFasta s =
  BL.unlines [fastaHeader (name s) (description s), toByteString $ characters s]

-- | Convert a list 'Sequence's to Fasta format. A newline is added between any
-- two 'Sequence's.
sequencesToFasta :: [Sequence] -> BL.ByteString
sequencesToFasta ss = BL.concat $ map sequenceToFasta ss