packages feed

cobot-io-0.1.3.14: src/Bio/FASTA/Writer.hs

module Bio.FASTA.Writer
  ( fastaToText
  , WritableFastaToken (..)
  ) where

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

class WritableFastaToken a where
    tokenToString :: a -> String

instance WritableFastaToken Char where
    tokenToString = pure

instance WritableFastaToken ModItem where
    tokenToString (Letter l) = [l]
    tokenToString (Mod m)    = modificationToString m

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

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

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

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