module Sound.Conductive.Table ( asciiTable
,displayPlayers
) where
import Data.List
import Data.Maybe
import Sound.Conductive.ConductiveBaseData
import Sound.Conductive.MusicalEnvironment
import Sound.Conductive.MutableMap
import Sound.Conductive.Player
join :: [a] -> [[a]] -> [a]
join delim l = concat (intersperse delim l)
asciiTable :: [[Char]]
-> [Char]
-> [[[Char]]]
-> [Char]
-> IO ()
asciiTable columnHeaders headerSeparator d spacer = let
buildColumn (a,b) = a++b
padStrings ss = let
longestString ss = maximum $ map length ss
l = longestString ss
toPad s longest = longest (length s)
padder longest s = concat $ s:(replicate (toPad s longest) " ")
in map (padder l) ss
separator x = replicate (length x ) $ head headerSeparator
tupleToList (x,y) = x:[y]
headers = map tupleToList $ zip columnHeaders $ map separator columnHeaders
preChart = transpose $ map padStrings $ map buildColumn $ zip headers d
in sequence_ [ putStrLn "\n"
, mapM_ putStrLn $ map (join spacer) preChart
, putStrLn "\n"
]
playerChartData e = do
ps <- players e
ss <- withPlayers e playerStatus ps
cs <- withPlayers e playerClock ps
as <- withPlayers e playerAction ps
is <- withPlayers e playerIOI ps
let sss = map show ss
let datum = sss:(map (map fromJust) [cs,as,is])
return $ ps:datum
displayPlayers :: MusicalEnvironment -> IO ()
displayPlayers e = let
pc = "player"
sc = "status"
cc = "clock"
ac = "action function"
ic = "IOI function"
columnHeaders = [pc,sc,cc,ac,ic]
in do d <- playerChartData e
asciiTable columnHeaders "=" d " "