-----------------------------------------------------------------------------
-- |
-- Module      :  Plugins.Monitors.Net.Common
-- Copyright   :  (c) 2011, 2012, 2013, 2014, 2017, 2020 Jose Antonio Ortega Ruiz
--                (c) 2007-2010 Andrea Rossato
-- License     :  BSD-style (see LICENSE)
--
-- Maintainer  :  Jose A. Ortega Ruiz <jao@gnu.org>
-- Stability   :  unstable
-- Portability :  unportable
--
-- A net device monitor for Xmobar
--

-----------------------------------------------------------------------------

module Xmobar.Plugins.Monitors.Net.Common (
                        NetDev(..)
                      , NetDevInfo(..)
                      , NetDevRawTotal
                      , NetDevRate
                      , NetDevRef
                      ) where

import Data.IORef (IORef)
import Data.Time.Clock (UTCTime)
import Data.Word (Word64)

data NetDev num = N String (NetDevInfo num) | NA deriving (NetDev num -> NetDev num -> Bool
(NetDev num -> NetDev num -> Bool)
-> (NetDev num -> NetDev num -> Bool) -> Eq (NetDev num)
forall num. Eq num => NetDev num -> NetDev num -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NetDev num -> NetDev num -> Bool
$c/= :: forall num. Eq num => NetDev num -> NetDev num -> Bool
== :: NetDev num -> NetDev num -> Bool
$c== :: forall num. Eq num => NetDev num -> NetDev num -> Bool
Eq,Int -> NetDev num -> ShowS
[NetDev num] -> ShowS
NetDev num -> String
(Int -> NetDev num -> ShowS)
-> (NetDev num -> String)
-> ([NetDev num] -> ShowS)
-> Show (NetDev num)
forall num. Show num => Int -> NetDev num -> ShowS
forall num. Show num => [NetDev num] -> ShowS
forall num. Show num => NetDev num -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NetDev num] -> ShowS
$cshowList :: forall num. Show num => [NetDev num] -> ShowS
show :: NetDev num -> String
$cshow :: forall num. Show num => NetDev num -> String
showsPrec :: Int -> NetDev num -> ShowS
$cshowsPrec :: forall num. Show num => Int -> NetDev num -> ShowS
Show,ReadPrec [NetDev num]
ReadPrec (NetDev num)
Int -> ReadS (NetDev num)
ReadS [NetDev num]
(Int -> ReadS (NetDev num))
-> ReadS [NetDev num]
-> ReadPrec (NetDev num)
-> ReadPrec [NetDev num]
-> Read (NetDev num)
forall num. Read num => ReadPrec [NetDev num]
forall num. Read num => ReadPrec (NetDev num)
forall num. Read num => Int -> ReadS (NetDev num)
forall num. Read num => ReadS [NetDev num]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [NetDev num]
$creadListPrec :: forall num. Read num => ReadPrec [NetDev num]
readPrec :: ReadPrec (NetDev num)
$creadPrec :: forall num. Read num => ReadPrec (NetDev num)
readList :: ReadS [NetDev num]
$creadList :: forall num. Read num => ReadS [NetDev num]
readsPrec :: Int -> ReadS (NetDev num)
$creadsPrec :: forall num. Read num => Int -> ReadS (NetDev num)
Read)
data NetDevInfo num = NI | ND num num deriving (NetDevInfo num -> NetDevInfo num -> Bool
(NetDevInfo num -> NetDevInfo num -> Bool)
-> (NetDevInfo num -> NetDevInfo num -> Bool)
-> Eq (NetDevInfo num)
forall num. Eq num => NetDevInfo num -> NetDevInfo num -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NetDevInfo num -> NetDevInfo num -> Bool
$c/= :: forall num. Eq num => NetDevInfo num -> NetDevInfo num -> Bool
== :: NetDevInfo num -> NetDevInfo num -> Bool
$c== :: forall num. Eq num => NetDevInfo num -> NetDevInfo num -> Bool
Eq,Int -> NetDevInfo num -> ShowS
[NetDevInfo num] -> ShowS
NetDevInfo num -> String
(Int -> NetDevInfo num -> ShowS)
-> (NetDevInfo num -> String)
-> ([NetDevInfo num] -> ShowS)
-> Show (NetDevInfo num)
forall num. Show num => Int -> NetDevInfo num -> ShowS
forall num. Show num => [NetDevInfo num] -> ShowS
forall num. Show num => NetDevInfo num -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NetDevInfo num] -> ShowS
$cshowList :: forall num. Show num => [NetDevInfo num] -> ShowS
show :: NetDevInfo num -> String
$cshow :: forall num. Show num => NetDevInfo num -> String
showsPrec :: Int -> NetDevInfo num -> ShowS
$cshowsPrec :: forall num. Show num => Int -> NetDevInfo num -> ShowS
Show,ReadPrec [NetDevInfo num]
ReadPrec (NetDevInfo num)
Int -> ReadS (NetDevInfo num)
ReadS [NetDevInfo num]
(Int -> ReadS (NetDevInfo num))
-> ReadS [NetDevInfo num]
-> ReadPrec (NetDevInfo num)
-> ReadPrec [NetDevInfo num]
-> Read (NetDevInfo num)
forall num. Read num => ReadPrec [NetDevInfo num]
forall num. Read num => ReadPrec (NetDevInfo num)
forall num. Read num => Int -> ReadS (NetDevInfo num)
forall num. Read num => ReadS [NetDevInfo num]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [NetDevInfo num]
$creadListPrec :: forall num. Read num => ReadPrec [NetDevInfo num]
readPrec :: ReadPrec (NetDevInfo num)
$creadPrec :: forall num. Read num => ReadPrec (NetDevInfo num)
readList :: ReadS [NetDevInfo num]
$creadList :: forall num. Read num => ReadS [NetDevInfo num]
readsPrec :: Int -> ReadS (NetDevInfo num)
$creadsPrec :: forall num. Read num => Int -> ReadS (NetDevInfo num)
Read)

type NetDevRawTotal = NetDev Word64
type NetDevRate = NetDev Float

type NetDevRef = IORef (NetDevRawTotal, UTCTime)

-- The more information available, the better.
-- Note that names don't matter. Therefore, if only the names differ,
-- a compare evaluates to EQ while (==) evaluates to False.
instance Ord num => Ord (NetDev num) where
    compare :: NetDev num -> NetDev num -> Ordering
compare NetDev num
NA NetDev num
NA             = Ordering
EQ
    compare NetDev num
NA NetDev num
_              = Ordering
LT
    compare NetDev num
_  NetDev num
NA             = Ordering
GT
    compare (N String
_ NetDevInfo num
i1) (N String
_ NetDevInfo num
i2) = NetDevInfo num
i1 NetDevInfo num -> NetDevInfo num -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` NetDevInfo num
i2

instance Ord num => Ord (NetDevInfo num) where
    compare :: NetDevInfo num -> NetDevInfo num -> Ordering
compare NetDevInfo num
NI NetDevInfo num
NI                 = Ordering
EQ
    compare NetDevInfo num
NI ND {}              = Ordering
LT
    compare ND {} NetDevInfo num
NI              = Ordering
GT
    compare (ND num
x1 num
y1) (ND num
x2 num
y2) = num
x1 num -> num -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` num
x2 Ordering -> Ordering -> Ordering
forall a. Semigroup a => a -> a -> a
<> num
y1 num -> num -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` num
y2