module Print
( printBlosum
, printBlosumCSV
) where
import Data.Maybe
import qualified Data.Map.Strict as Map
import qualified Data.Text as T
import TextShow
import Types
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
]
)
)
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