module Xmobar.Plugins.Monitors.Cpu.Linux (parseCpu
, CpuDataRef
, cpuData) where
import Xmobar.Plugins.Monitors.Cpu.Common (CpuData(..))
import qualified Data.ByteString.Lazy.Char8 as B
import Data.IORef (IORef, readIORef, writeIORef)
type CpuDataRef = IORef [Int]
cpuData :: IO [Int]
cpuData :: IO [Int]
cpuData = ByteString -> [Int]
cpuParser forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char] -> IO ByteString
B.readFile [Char]
"/proc/stat"
readInt :: B.ByteString -> Int
readInt :: ByteString -> Int
readInt ByteString
bs = case ByteString -> Maybe (Int, ByteString)
B.readInt ByteString
bs of
Maybe (Int, ByteString)
Nothing -> Int
0
Just (Int
i, ByteString
_) -> Int
i
cpuParser :: B.ByteString -> [Int]
cpuParser :: ByteString -> [Int]
cpuParser = forall a b. (a -> b) -> [a] -> [b]
map ByteString -> Int
readInt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
tail forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [ByteString]
B.words forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
head forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [ByteString]
B.lines
convertToCpuData :: [Float] -> CpuData
convertToCpuData :: [Float] -> CpuData
convertToCpuData (Float
u:Float
n:Float
s:Float
ie:Float
iw:[Float]
_) =
CpuData
{ cpuUser :: Float
cpuUser = Float
u
, cpuNice :: Float
cpuNice = Float
n
, cpuSystem :: Float
cpuSystem = Float
s
, cpuIdle :: Float
cpuIdle = Float
ie
, cpuIowait :: Float
cpuIowait = Float
iw
, cpuTotal :: Float
cpuTotal = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Float
u, Float
n, Float
s]
}
convertToCpuData [Float]
args = forall a. HasCallStack => [Char] -> a
error forall a b. (a -> b) -> a -> b
$ [Char]
"convertToCpuData: Unexpected list" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> [Char]
show [Float]
args
parseCpu :: CpuDataRef -> IO CpuData
parseCpu :: CpuDataRef -> IO CpuData
parseCpu CpuDataRef
cref =
do [Int]
a <- forall a. IORef a -> IO a
readIORef CpuDataRef
cref
[Int]
b <- IO [Int]
cpuData
forall a. IORef a -> a -> IO ()
writeIORef CpuDataRef
cref [Int]
b
let dif :: [Int]
dif = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (-) [Int]
b [Int]
a
tot :: Float
tot = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Int]
dif
safeDiv :: a -> Float
safeDiv a
n = case Float
tot of
Float
0 -> Float
0
Float
v -> forall a b. (Integral a, Num b) => a -> b
fromIntegral a
n forall a. Fractional a => a -> a -> a
/ Float
v
percent :: [Float]
percent = forall a b. (a -> b) -> [a] -> [b]
map forall {a}. Integral a => a -> Float
safeDiv [Int]
dif
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ [Float] -> CpuData
convertToCpuData [Float]
percent