module Xmobar.Plugins.Monitors.CpuFreq where
import Xmobar.Plugins.Monitors.Common
cpuFreqConfig :: IO MConfig
cpuFreqConfig :: IO MConfig
cpuFreqConfig =
String -> [String] -> IO MConfig
mkMConfig String
"Freq: <cpu0>"
([String
"max", String
"min", String
"avg"] forall a. [a] -> [a] -> [a]
++ forall a b. (a -> b) -> [a] -> [b]
map (forall a. [a] -> [a] -> [a]
(++) String
"cpu" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> String
show) [Int
0 :: Int ..])
runCpuFreq :: [String] -> Monitor String
runCpuFreq :: [String] -> Monitor String
runCpuFreq [String]
_ = do
Bool
suffix <- forall a. Selector a -> Monitor a
getConfigValue MConfig -> IORef Bool
useSuffix
Int
ddigits <- forall a. Selector a -> Monitor a
getConfigValue MConfig -> IORef Int
decDigits
let paths :: [String]
paths = [String
"/sys/devices/system/cpu/cpu", String
"/cpufreq/scaling_cur_freq"]
divisor :: Double
divisor = Double
1e6 :: Double
fmt :: Double -> String
fmt Double
x | Double
x forall a. Ord a => a -> a -> Bool
< Double
1 = if Bool
suffix then forall {a}. RealFrac a => a -> String
mhzFmt Double
x forall a. [a] -> [a] -> [a]
++ String
"MHz"
else Double -> String
ghzFmt Double
x
| Bool
otherwise = Double -> String
ghzFmt Double
x forall a. [a] -> [a] -> [a]
++ if Bool
suffix then String
"GHz" else String
""
mhzFmt :: a -> String
mhzFmt a
x = forall a. Show a => a -> String
show (forall a b. (RealFrac a, Integral b) => a -> b
round (a
x forall a. Num a => a -> a -> a
* a
1000) :: Integer)
ghzFmt :: Double -> String
ghzFmt = forall a. RealFloat a => Int -> a -> String
showDigits Int
ddigits
sts :: t a -> [a]
sts t a
xs = [forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum t a
xs, forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum t a
xs, forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum t a
xs forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall (t :: * -> *) a. Foldable t => t a -> Int
length t a
xs)]
[Double]
vs <- [[String]] -> Monitor [Double]
checkedDataRead [[String]
paths]
if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Double]
vs then forall a. Selector a -> Monitor a
getConfigValue MConfig -> IORef String
naString
else forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall a. (Num a, Ord a) => (a -> String) -> a -> Monitor String
showWithColors Double -> String
fmt forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Fractional a => a -> a -> a
/Double
divisor)) (forall {t :: * -> *} {a}.
(Foldable t, Ord a, Fractional a) =>
t a -> [a]
sts [Double]
vs forall a. [a] -> [a] -> [a]
++ [Double]
vs) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [String] -> Monitor String
parseTemplate