{-# Language OverloadedStrings #-}
{-|
Module      : Client.View.RtsStats
Description : View current GHC RTS statistics
Copyright   : (c) Eric Mertens, 2017
License     : ISC
Maintainer  : emertens@gmail.com

Lines for the @/rtsstats@ command.

-}

module Client.View.RtsStats
  ( rtsStatsLines
  ) where

import           Client.Image.PackedImage
import           Client.Image.Palette
import           Control.Lens
import           Graphics.Vty.Attributes
import           RtsStats

-- | Generate lines used for @/rtsstats@.
rtsStatsLines :: Maybe Stats -> Palette -> [Image']
rtsStatsLines :: Maybe Stats -> Palette -> [Image']
rtsStatsLines Maybe Stats
Nothing Palette
pal = [Attr -> Text -> Image'
text' (forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' Palette Attr
palError Palette
pal) Text
"Statistics not available"]
rtsStatsLines (Just Stats
stats) Palette
pal
  | forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Text, Text)]
entries = [Attr -> Text -> Image'
text' (forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' Palette Attr
palError Palette
pal) Text
"Statistics empty"]
  | Bool
otherwise    = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\Image'
v Image'
l -> Int -> Image' -> Image'
padV Int
wv Image'
v forall a. Semigroup a => a -> a -> a
<> Image'
" " forall a. Semigroup a => a -> a -> a
<> Image'
l) [Image']
valueImages [Image']
labelImages
  where
    entries :: [(Text, Text)]
entries     = Stats -> [(Text, Text)]
statsToEntries Stats
stats
    labelImages :: [Image']
labelImages = forall a b. (a -> b) -> [a] -> [b]
map (Attr -> Text -> Image'
text' (forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' Palette Attr
palLabel Palette
pal) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst) [(Text, Text)]
entries
    valueImages :: [Image']
valueImages = forall a b. (a -> b) -> [a] -> [b]
map (Attr -> Text -> Image'
text' Attr
defAttr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd) [(Text, Text)]
entries
    wv :: Int
wv          = forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum (Int
0 forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map Image' -> Int
imageWidth [Image']
valueImages)
    padV :: Int -> Image' -> Image'
padV Int
n Image'
img  = Attr -> String -> Image'
string Attr
defAttr (forall a. Int -> a -> [a]
replicate (Int
n forall a. Num a => a -> a -> a
- Image' -> Int
imageWidth Image'
img) Char
' ') forall a. Semigroup a => a -> a -> a
<> Image'
img