module Utility
( getSeq
, sortTuple
, nub'
, groupBlocks
, cutEnds
, sumMap
) where
import Data.List
import qualified Data.Set as Set
import qualified Data.Map.Strict as Map
import qualified Data.Sequence as Seq
import qualified Data.Text as T
import Data.Fasta.Text ( FastaSequence, fastaSeq, fastaHeader )
import Types
nub' :: (Ord a) => [a] -> [a]
nub' = Set.toList . Set.fromList
getSeq :: FastaSequence -> [AA]
getSeq = map AA . T.unpack . fastaSeq
sortTuple :: (Ord a) => (a, a) -> (a, a)
sortTuple t@(!x, !y)
| x <= y = t
| otherwise = (y, x)
groupBlocks :: Maybe Field -> [FastaSequence] -> [[FastaSequence]]
groupBlocks (Just field) = groupBy
(\x y -> getField field x == getField field y)
groupBlocks Nothing = (:[])
getField :: Field -> FastaSequence -> T.Text
getField (Field x) = (!! (x 1)) . T.splitOn "|" . fastaHeader
cutEnds :: Seq.Seq a -> Seq.Seq a
cutEnds = Seq.reverse . Seq.drop 1 . Seq.reverse . Seq.drop 1
sumMap :: (Ord a, Num b) => Map.Map a b -> b
sumMap = Map.foldl' (+) 0