{-# LANGUAGE OverloadedStrings #-} module Main where import Common import Data.Text (pack) import Turtle data MemType = MemTotal | MemFree main :: IO () main = sh $ (liftIO . putStrLn . format') =<< (memory :: Shell Float) where format' mem = "\62171 " ++ formatFloatN mem 2 ++ "G" 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