module System.Taffybar.Information.StreamInfo
( getParsedInfo
, getLoad
, getAccLoad
, getTransfer
) where
import Control.Concurrent ( threadDelay )
import Data.IORef
import Data.Maybe ( fromMaybe )
getParsedInfo :: FilePath -> (String -> [(String, [a])]) -> String -> IO [a]
getParsedInfo :: forall a.
FilePath -> (FilePath -> [(FilePath, [a])]) -> FilePath -> IO [a]
getParsedInfo FilePath
path FilePath -> [(FilePath, [a])]
parser FilePath
selector = do
file <- FilePath -> IO FilePath
readFile FilePath
path
length file `seq` return ()
return (fromMaybe [] $ lookup selector $ parser file)
truncVal :: (RealFloat a) => a -> a
truncVal :: forall a. RealFloat a => a -> a
truncVal a
v
| a -> Bool
forall a. RealFloat a => a -> Bool
isNaN a
v Bool -> Bool -> Bool
|| a
v a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
0.0 = a
0.0
| Bool
otherwise = a
v
toRatioList :: (Integral a, RealFloat b) => [a] -> [b]
toRatioList :: forall a b. (Integral a, RealFloat b) => [a] -> [b]
toRatioList [a]
deltas = (b -> b) -> [b] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map b -> b
forall a. RealFloat a => a -> a
truncVal [b]
ratios
where total :: b
total = a -> b
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
$ [a] -> a
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [a]
deltas
ratios :: [b]
ratios = (a -> b) -> [a] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map ((b -> b -> b
forall a. Fractional a => a -> a -> a
/b
total) (b -> b) -> (a -> b) -> a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
forall a b. (Integral a, Num b) => a -> b
fromIntegral) [a]
deltas
probe :: (Num a, RealFrac b) => IO [a] -> b -> IO [a]
probe :: forall a b. (Num a, RealFrac b) => IO [a] -> b -> IO [a]
probe IO [a]
action b
delay = do
a <- IO [a]
action
threadDelay $ round (delay * 1e6)
b <- action
return $ zipWith (-) b a
accProbe :: (Num a) => IO [a] -> IORef [a] -> IO [a]
accProbe :: forall a. Num a => IO [a] -> IORef [a] -> IO [a]
accProbe IO [a]
action IORef [a]
sample = do
a <- IORef [a] -> IO [a]
forall a. IORef a -> IO a
readIORef IORef [a]
sample
b <- action
writeIORef sample b
return $ zipWith (-) b a
getTransfer :: (Integral a, RealFloat b) => b -> IO [a] -> IO [b]
getTransfer :: forall a b. (Integral a, RealFloat b) => b -> IO [a] -> IO [b]
getTransfer b
interval IO [a]
action = do
deltas <- IO [a] -> b -> IO [a]
forall a b. (Num a, RealFrac b) => IO [a] -> b -> IO [a]
probe IO [a]
action b
interval
return $ map (truncVal . (/interval) . fromIntegral) deltas
getLoad :: (Integral a, RealFloat b) => b -> IO [a] -> IO [b]
getLoad :: forall a b. (Integral a, RealFloat b) => b -> IO [a] -> IO [b]
getLoad b
interval IO [a]
action = [a] -> [b]
forall a b. (Integral a, RealFloat b) => [a] -> [b]
toRatioList ([a] -> [b]) -> IO [a] -> IO [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO [a] -> b -> IO [a]
forall a b. (Num a, RealFrac b) => IO [a] -> b -> IO [a]
probe IO [a]
action b
interval
getAccLoad :: (Integral a, RealFloat b) => IORef [a] -> IO [a] -> IO [b]
getAccLoad :: forall a b.
(Integral a, RealFloat b) =>
IORef [a] -> IO [a] -> IO [b]
getAccLoad IORef [a]
sample IO [a]
action = [a] -> [b]
forall a b. (Integral a, RealFloat b) => [a] -> [b]
toRatioList ([a] -> [b]) -> IO [a] -> IO [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO [a] -> IORef [a] -> IO [a]
forall a. Num a => IO [a] -> IORef [a] -> IO [a]
accProbe IO [a]
action IORef [a]
sample