    --------------------------------------------------------------------------------
    -- |
    -- Module      : System.Taffybar.Widget.DiskIOMonitor
    -- Copyright   : (c) José A. Romero L.
    -- License     : BSD3-style (see LICENSE)
    --
    -- Maintainer  : José A. Romero L. <escherdragon@gmail.com>
    -- Stability   : unstable
    -- Portability : unportable
    --
    -- Simple Disk IO monitor that uses a PollingGraph to visualize the speed of
    -- read/write operations in one selected disk or partition.
    --
    --------------------------------------------------------------------------------

    module System.Taffybar.Widget.DiskIOMonitor ( dioMonitorNew ) where

    import           Control.Monad.IO.Class
    import qualified GI.Gtk
    import           System.Taffybar.Information.DiskIO ( getDiskTransfer )
    import           System.Taffybar.Widget.Generic.PollingGraph ( GraphConfig, pollingGraphNew )

    -- | Creates a new disk IO monitor widget. This is a 'PollingGraph' fed by
    -- regular calls to 'getDiskTransfer'. The results of calling this function
    -- are normalized to the maximum value of the obtained probe (either read or
    -- write transfer).
    dioMonitorNew
      :: MonadIO m
      => GraphConfig -- ^ Configuration data for the Graph.
      -> Double -- ^ Polling period (in seconds).
      -> String -- ^ Name of the disk or partition to watch (e.g. \"sda\", \"sdb1\").
      -> m GI.Gtk.Widget
    dioMonitorNew :: forall (m :: * -> *).
    MonadIO m =>
    GraphConfig -> Double -> String -> m Widget
    dioMonitorNew GraphConfig
    cfg Double
    pollSeconds =
      GraphConfig -> Double -> IO [Double] -> m Widget
    forall (m :: * -> *).
    MonadIO m =>
    GraphConfig -> Double -> IO [Double] -> m Widget
    pollingGraphNew GraphConfig
    cfg Double
    pollSeconds (IO [Double] -> m Widget)
    -> (String -> IO [Double]) -> String -> m Widget
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . String -> IO [Double]
    probeDisk

    probeDisk :: String -> IO [Double]
    probeDisk :: String -> IO [Double]
    probeDisk String
    disk = do
      [Double]
    transfer <- String -> IO [Double]
    getDiskTransfer String
    disk
      let top :: Double
    top = (Double -> Double -> Double) -> Double -> [Double] -> Double
    forall a b. (a -> b -> b) -> b -> [a] -> b
    forall (t :: * -> *) a b.
    Foldable t =>
    (a -> b -> b) -> b -> t a -> b
    foldr Double -> Double -> Double
    forall a. Ord a => a -> a -> a
    max Double
    1.0 [Double]
    transfer
      [Double] -> IO [Double]
    forall a. a -> IO a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ([Double] -> IO [Double]) -> [Double] -> IO [Double]
    forall a b. (a -> b) -> a -> b
    $ (Double -> Double) -> [Double] -> [Double]
    forall a b. (a -> b) -> [a] -> [b]
    map (Double -> Double -> Double
    forall a. Fractional a => a -> a -> a
    /Double
    top) [Double]
    transfer