blosum-0.1.1.1: src/Print.hs
{- Print
by Gregory Schwartz
-- | Collects the functions pertaining to the printing of the BLOSUM matrix
-}
{-# LANGUAGE OverloadedStrings #-}
module Print
( printBlosum
, printBlosumCSV
) where
-- Standard
import Data.Maybe
import qualified Data.Map.Strict as Map
-- Cabal
import qualified Data.Text as T
import TextShow
-- Local
import Types
-- | Print the BLOSUM matrix as a dataframe
printBlosum :: Blosum -> T.Text
printBlosum = T.append header . T.append "\n" . body . unBlosum
where
header = "source,destination,value"
body = T.unlines
. concatMap Map.elems
. Map.elems
. Map.mapWithKey
( \(AA x) -> Map.mapWithKey
(\ (AA y) (BlosumVal v)
-> T.intercalate "," [ T.singleton x
, T.singleton y
, showt v
]
)
)
-- | Print the BLOSUM matrix as a csv matrix according to a certain order
printBlosumCSV :: [AA] -> Blosum -> T.Text
printBlosumCSV order = T.append header . T.append "\n" . body . unBlosum
where
header = T.intercalate "," . ("" :) . map (T.singleton . unAA) $ order
body m = T.unlines
. map ( \x -> T.append (flip T.snoc ',' . T.singleton . unAA $ x)
. fromMaybe ""
. flip Map.lookup (printMap m)
$ x
)
$ order
printMap :: Map.Map AA (Map.Map AA BlosumVal) -> Map.Map AA T.Text
printMap = Map.map ( \v -> T.intercalate ","
. map (flip lookZero v)
$ order
)
lookZero k = fromMaybe "" . fmap (showt . unBlosumVal) . Map.lookup k