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 :: Fasta Char -> Text
fastaToText Fasta Char
f = [Text] -> Text
forall a. Monoid a => [a] -> a
mconcat ([Text] -> Text) -> [Text] -> Text
forall a b. (a -> b) -> a -> b
$ (FastaItem Char -> Text) -> Fasta Char -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map FastaItem Char -> Text
writeItem Fasta Char
f

writeItem :: FastaItem Char -> Text
writeItem :: FastaItem Char -> Text
writeItem (FastaItem Text
name BareSequence Char
s) = Text
">" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\n" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> BareSequence Char -> Text
seq2Text BareSequence Char
s

seq2Text :: BareSequence Char -> Text
seq2Text :: BareSequence Char -> Text
seq2Text BareSequence Char
s = String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Vector Char -> String
vector2Text (Vector Char -> String) -> Vector Char -> String
forall a b. (a -> b) -> a -> b
$ BareSequence Char
s BareSequence Char
-> Getting (Vector Char) (BareSequence Char) (Vector Char)
-> Vector Char
forall s a. s -> Getting a s a -> a
^. Getting (Vector Char) (BareSequence Char) (Vector Char)
forall mk w a. Getter (Sequence mk w a) (Vector a)
Bio.Sequence.sequ

vector2Text :: Vector Char -> String
vector2Text :: Vector Char -> String
vector2Text Vector Char
v = (String -> String) -> [String] -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n") ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ Int -> String -> [String]
forall e. Int -> [e] -> [[e]]
chunksOf Int
80 (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$ Vector Char -> String
forall a. Vector a -> [a]
toList Vector Char
v