{-# LANGUAGE OverloadedStrings #-}
module Main where
import Common
import Data.Text (pack)
import Turtle
import Data.Maybe
import System.Environment (getArgs)
import Data.Text.IO (putStrLn)
import Prelude hiding (putStrLn)
data MemType = MemTotal | MemFree
main :: IO ()
main = sh $ do
icons <- liftIO getArgs
(liftIO . putStrLn . format' icons) =<< (memory :: Shell Float)
where
format' icons mem =
let icon = fromMaybe "" $ getIcon icons
usedMem = pack $ formatFloatN mem 2
in icon <> usedMem <> "G"
getIcon :: [String] -> Maybe Text
getIcon icons = case icons of
icon : _ -> Just $ pack icon
_ -> Nothing
memory :: RealFloat a => Shell a
memory = do
let memoryReport = input (filePath "/proc/meminfo")
memFree <- parseMemory memoryReport MemFree
memTotal <- parseMemory memoryReport MemTotal
return $ kbsToGb (fromIntegral $ memTotal - memFree)
where
kbsToGb kbs = kbs / 1024 / 1024
parseMemory memoryReport k =
head . match (parseMem k) <$> strict (grep (parseMem k) memoryReport)
parseMem :: MemType -> Pattern Integer
parseMem memType = parseMemType memType *> spaces1 *> decimal <* star anyChar
parseMemType :: MemType -> Pattern Text
parseMemType t = toMem t <> ":"
where
toMem MemTotal = "MemTotal"
toMem MemFree = "MemFree"
filePath :: String -> Turtle.FilePath
filePath p = fromText $ pack p