-----------------------------------------------------------------------------
-- |
-- 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 = (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 :: Map String Float
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. [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. [a] -> Int -> a
!! Int
1 :: Float) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
1024)) [[String]]
content
           [Float
total, Float
free, Float
buffer, Float
cache] =
             (String -> Float) -> [String] -> [Float]
forall a b. (a -> b) -> [a] -> [b]
map (Map String Float
info Map String Float -> String -> Float
forall k a. Ord k => Map k a -> k -> a
M.!) [String
"MemTotal:", String
"MemFree:", String
"Buffers:", String
"Cached:"]
           available :: Float
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
used = Float
total Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
available
           usedratio :: Float
usedratio = Float
used Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
total
           freeratio :: Float
freeratio = Float
free Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
total
           availableratio :: Float
availableratio = Float
available Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
total
       [Float] -> IO [Float]
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]