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
                    }