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