module Bio.FASTA.Writer
  ( fastaToText
  ) where

import           Bio.FASTA.Type     (Fasta, FastaItem(..))
import           Bio.Sequence       (BareSequence, sequ)
import           Control.Lens       ((^.))
import           Data.Text          (Text, pack)
import           Data.List.Split    (chunksOf)
import           Data.Vector        (Vector, toList)
import           Prelude     hiding (drop)

fastaToText :: Fasta Char -> Text
fastaToText f = mconcat $ map writeItem f

writeItem :: FastaItem Char -> Text
writeItem (FastaItem name s) = ">" <> name <> "\n" <> seq2Text s

seq2Text :: BareSequence Char -> Text
seq2Text s = pack $ vector2Text $ s ^. Bio.Sequence.sequ

vector2Text :: Vector Char -> String
vector2Text v = concatMap (++ "\n") $ chunksOf 80 $ toList v