    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 base maxValue value =
      logBase base (min value maxValue) / actualMax
        where actualMax = logBase base maxValue

    networkGraphNew :: GraphConfig -> Maybe [String] -> TaffyIO GI.Gtk.Widget
    networkGraphNew config interfaces = do
      NetworkInfoChan chan <- getNetworkChan
      let filterFn = maybe (const True) (flip elem) interfaces
          getUpDown = sumSpeeds . map snd . filter (filterFn . fst)
          toLogScale = logScale 2 (2 ** 32)
          toSample (up, down) = map (toLogScale . fromRational) [up, down]
          sampleBuilder = return . toSample . getUpDown
      channelGraphNew config chan sampleBuilder