module System.Information.Memory (
MemoryInfo(..),
parseMeminfo
) where
toMB :: [String] -> Double
toMB line = (read $ line !! 1 :: Double) / 1024
data MemoryInfo = MemoryInfo { memoryUsedRatio :: Double
, memoryTotal :: Double
, memoryFree :: Double
, memoryBuffer :: Double
, memoryCache :: Double
, memoryRest :: Double
, memoryUsed :: Double
}
parseMeminfo :: IO MemoryInfo
parseMeminfo = do
s <- readFile "/proc/meminfo"
let content = map words $ take 4 $ lines s
[total, free, buffer, cache ] = map toMB content
rest = free + buffer + cache
used = total rest
usedRatio = used / total
return MemoryInfo { memoryUsedRatio = usedRatio
, memoryTotal = total
, memoryFree = free
, memoryBuffer = buffer
, memoryCache = cache
, memoryRest = rest
, memoryUsed = used
}