-----------------------------------------------------------------------------
-- |
-- Module      :  Plugins.Monitors.Mem.Linux
-- Copyright   :  (c) Andrea Rossato
-- License     :  BSD-style (see LICENSE)
--
-- Maintainer  :  Jose A. Ortega Ruiz <jao@gnu.org>
-- Stability   :  unstable
-- Portability :  unportable
--
-- A memory monitor for Xmobar
--
-----------------------------------------------------------------------------

module Xmobar.Plugins.Monitors.Mem.Linux (parseMEM) where

import qualified Data.Map as M

fileMEM :: IO String
fileMEM :: IO String
fileMEM = String -> IO String
readFile String
"/proc/meminfo"

parseMEM :: IO [Float]
parseMEM :: IO [Float]
parseMEM =
    do file <- IO String
fileMEM
       let content = (String -> [String]) -> [String] -> [[String]]
forall a b. (a -> b) -> [a] -> [b]
map String -> [String]
words ([String] -> [[String]]) -> [String] -> [[String]]
forall a b. (a -> b) -> a -> b
$ Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
8 ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ String -> [String]
lines String
file
           info = [(String, Float)] -> Map String Float
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(String, Float)] -> Map String Float)
-> [(String, Float)] -> Map String Float
forall a b. (a -> b) -> a -> b
$ ([String] -> (String, Float)) -> [[String]] -> [(String, Float)]
forall a b. (a -> b) -> [a] -> [b]
map (
             \[String]
line -> ([String] -> String
forall a. HasCallStack => [a] -> a
head [String]
line, (String -> Float
forall a. Read a => String -> a
read (String -> Float) -> String -> Float
forall a b. (a -> b) -> a -> b
$ [String]
line [String] -> Int -> String
forall a. HasCallStack => [a] -> Int -> a
!! Int
1 :: Float) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
1024)) [[String]]
content
           info' String
x = Map String Float
info Map String Float -> String -> Float
forall k a. Ord k => Map k a -> k -> a
M.! (String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
":")
           total = String -> Float
info' String
"MemTotal"
           free = String -> Float
info' String
"MemFree"
           buffer = String -> Float
info' String
"Buffers"
           cache = String -> Float
info' String
"Cached"
           available =
             Float -> String -> Map String Float -> Float
forall k a. Ord k => a -> k -> Map k a -> a
M.findWithDefault (Float
free Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
buffer Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
cache) String
"MemAvailable:" Map String Float
info
           used = Float
total Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
available
           usedratio = Float
used Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
total
           freeratio = Float
free Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
total
           availableratio = Float
available Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
total
       return [ usedratio, freeratio, availableratio
              , total, free, buffer, cache, available, used]