module System.Taffybar.Information.Memory (
MemoryInfo(..),
parseMeminfo
) where
toMB :: String -> Double
toMB :: String -> Double
toMB String
size = (String -> Double
forall a. Read a => String -> a
read String
size :: Double) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
1024
data MemoryInfo = MemoryInfo
{ MemoryInfo -> Double
memoryTotal :: Double
, MemoryInfo -> Double
memoryFree :: Double
, MemoryInfo -> Double
memoryBuffer :: Double
, MemoryInfo -> Double
memoryCache :: Double
, MemoryInfo -> Double
memorySwapTotal :: Double
, MemoryInfo -> Double
memorySwapFree :: Double
, MemoryInfo -> Double
memorySwapUsed :: Double
, MemoryInfo -> Double
memorySwapUsedRatio :: Double
, MemoryInfo -> Double
memoryAvailable :: Double
, MemoryInfo -> Double
memoryRest :: Double
, MemoryInfo -> Double
memoryUsed :: Double
, MemoryInfo -> Double
memoryUsedRatio :: Double
}
emptyMemoryInfo :: MemoryInfo
emptyMemoryInfo :: MemoryInfo
emptyMemoryInfo = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> MemoryInfo
MemoryInfo Double
0 Double
0 Double
0 Double
0 Double
0 Double
0 Double
0 Double
0 Double
0 Double
0 Double
0 Double
0
parseLines :: [String] -> MemoryInfo -> MemoryInfo
parseLines :: [String] -> MemoryInfo -> MemoryInfo
parseLines (String
line:[String]
rest) MemoryInfo
memInfo = [String] -> MemoryInfo -> MemoryInfo
parseLines [String]
rest MemoryInfo
newMemInfo
where newMemInfo :: MemoryInfo
newMemInfo = case String -> [String]
words String
line of
(String
label:String
size:[String]
_) ->
case String
label of
String
"MemTotal:" -> MemoryInfo
memInfo { memoryTotal = toMB size }
String
"MemFree:" -> MemoryInfo
memInfo { memoryFree = toMB size }
String
"MemAvailable:" -> MemoryInfo
memInfo { memoryAvailable = toMB size }
String
"Buffers:" -> MemoryInfo
memInfo { memoryBuffer = toMB size }
String
"Cached:" -> MemoryInfo
memInfo { memoryCache = toMB size }
String
"SwapTotal:" -> MemoryInfo
memInfo { memorySwapTotal = toMB size }
String
"SwapFree:" -> MemoryInfo
memInfo { memorySwapFree = toMB size }
String
_ -> MemoryInfo
memInfo
[String]
_ -> MemoryInfo
memInfo
parseLines [String]
_ MemoryInfo
memInfo = MemoryInfo
memInfo
parseMeminfo :: IO MemoryInfo
parseMeminfo :: IO MemoryInfo
parseMeminfo = do
String
s <- String -> IO String
readFile String
"/proc/meminfo"
let m :: MemoryInfo
m = [String] -> MemoryInfo -> MemoryInfo
parseLines (String -> [String]
lines String
s) MemoryInfo
emptyMemoryInfo
rest :: Double
rest = MemoryInfo -> Double
memoryFree MemoryInfo
m Double -> Double -> Double
forall a. Num a => a -> a -> a
+ MemoryInfo -> Double
memoryBuffer MemoryInfo
m Double -> Double -> Double
forall a. Num a => a -> a -> a
+ MemoryInfo -> Double
memoryCache MemoryInfo
m
used :: Double
used = MemoryInfo -> Double
memoryTotal MemoryInfo
m Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
rest
usedRatio :: Double
usedRatio = Double
used Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ MemoryInfo -> Double
memoryTotal MemoryInfo
m
swapUsed :: Double
swapUsed = MemoryInfo -> Double
memorySwapTotal MemoryInfo
m Double -> Double -> Double
forall a. Num a => a -> a -> a
- MemoryInfo -> Double
memorySwapFree MemoryInfo
m
swapUsedRatio :: Double
swapUsedRatio = Double
swapUsed Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ MemoryInfo -> Double
memorySwapTotal MemoryInfo
m
MemoryInfo -> IO MemoryInfo
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return MemoryInfo
m { memoryRest = rest
, memoryUsed = used
, memoryUsedRatio = usedRatio
, memorySwapUsed = swapUsed
, memorySwapUsedRatio = swapUsedRatio
}