module System.Taffybar.Widget.NetworkGraph where

import qualified GI.Gtk
import System.Taffybar.Context
import System.Taffybar.Hooks
import System.Taffybar.Information.Network
import System.Taffybar.Widget.Generic.ChannelGraph
import System.Taffybar.Widget.Generic.Graph

logScale :: Double -> Double -> Double -> Double
logScale :: Double -> Double -> Double -> Double
logScale Double
base Double
maxValue Double
value =
  Double -> Double -> Double
forall a. Floating a => a -> a -> a
logBase Double
base (Double -> Double -> Double
forall a. Ord a => a -> a -> a
min Double
value Double
maxValue) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
actualMax
    where actualMax :: Double
actualMax = Double -> Double -> Double
forall a. Floating a => a -> a -> a
logBase Double
base Double
maxValue

networkGraphNew :: GraphConfig -> Maybe [String] -> TaffyIO GI.Gtk.Widget
networkGraphNew :: GraphConfig -> Maybe [String] -> TaffyIO Widget
networkGraphNew GraphConfig
config Maybe [String]
interfaces = do
  NetworkInfoChan BroadcastChan In [(String, (Rational, Rational))]
chan <- TaffyIO NetworkInfoChan
getNetworkChan
  let filterFn :: String -> Bool
filterFn = (String -> Bool)
-> ([String] -> String -> Bool) -> Maybe [String] -> String -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Bool -> String -> Bool
forall a b. a -> b -> a
const Bool
True) ((String -> [String] -> Bool) -> [String] -> String -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem) Maybe [String]
interfaces
      getUpDown :: [(String, (Rational, Rational))] -> (Rational, Rational)
getUpDown = [(Rational, Rational)] -> (Rational, Rational)
sumSpeeds ([(Rational, Rational)] -> (Rational, Rational))
-> ([(String, (Rational, Rational))] -> [(Rational, Rational)])
-> [(String, (Rational, Rational))]
-> (Rational, Rational)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String, (Rational, Rational)) -> (Rational, Rational))
-> [(String, (Rational, Rational))] -> [(Rational, Rational)]
forall a b. (a -> b) -> [a] -> [b]
map (String, (Rational, Rational)) -> (Rational, Rational)
forall a b. (a, b) -> b
snd ([(String, (Rational, Rational))] -> [(Rational, Rational)])
-> ([(String, (Rational, Rational))]
    -> [(String, (Rational, Rational))])
-> [(String, (Rational, Rational))]
-> [(Rational, Rational)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String, (Rational, Rational)) -> Bool)
-> [(String, (Rational, Rational))]
-> [(String, (Rational, Rational))]
forall a. (a -> Bool) -> [a] -> [a]
filter (String -> Bool
filterFn (String -> Bool)
-> ((String, (Rational, Rational)) -> String)
-> (String, (Rational, Rational))
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String, (Rational, Rational)) -> String
forall a b. (a, b) -> a
fst)
      toLogScale :: Double -> Double
toLogScale = Double -> Double -> Double -> Double
logScale Double
2 (Double
2 Double -> Double -> Double
forall a. Floating a => a -> a -> a
** Double
32)
      toSample :: (Rational, Rational) -> [Double]
toSample (Rational
up, Rational
down) = (Rational -> Double) -> [Rational] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (Double -> Double
toLogScale (Double -> Double) -> (Rational -> Double) -> Rational -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Double
forall a. Fractional a => Rational -> a
fromRational) [Rational
up, Rational
down]
      sampleBuilder :: [(String, (Rational, Rational))] -> IO [Double]
sampleBuilder = [Double] -> IO [Double]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Double] -> IO [Double])
-> ([(String, (Rational, Rational))] -> [Double])
-> [(String, (Rational, Rational))]
-> IO [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rational, Rational) -> [Double]
toSample ((Rational, Rational) -> [Double])
-> ([(String, (Rational, Rational))] -> (Rational, Rational))
-> [(String, (Rational, Rational))]
-> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(String, (Rational, Rational))] -> (Rational, Rational)
getUpDown
  GraphConfig
-> BroadcastChan In [(String, (Rational, Rational))]
-> ([(String, (Rational, Rational))] -> IO [Double])
-> TaffyIO Widget
forall (m :: * -> *) a.
MonadIO m =>
GraphConfig -> BroadcastChan In a -> (a -> IO [Double]) -> m Widget
channelGraphNew GraphConfig
config BroadcastChan In [(String, (Rational, Rational))]
chan [(String, (Rational, Rational))] -> IO [Double]
sampleBuilder