------------------------------------------------------------------------------
-- |
-- Module: Xmobar.Plugins.Monitors.Run
-- Copyright: (c) 2018 Jose Antonio Ortega Ruiz
-- License: BSD3-style (see LICENSE)
--
-- Maintainer: jao@gnu.org
-- Stability: unstable
-- Portability: portable
-- Created: Sun Dec 02, 2018 04:17
--
--
-- Running a monitor
--
------------------------------------------------------------------------------


module Xmobar.Plugins.Monitors.Common.Run ( runM
                                          , runMD
                                          , runMB
                                          , runMBD
                                          , runML
                                          , runMLD
                                          , getArgvs
                                          , doArgs
                                          , computeMonitorConfig
                                          , pluginOptions
                                          ) where

import Control.Exception (SomeException,handle)
import Data.List
import Control.Monad.Reader
import System.Console.GetOpt

import Xmobar.Plugins.Monitors.Common.Types
import Xmobar.Run.Exec (doEveryTenthSeconds)

pluginOptions :: [OptDescr Opts]
pluginOptions :: [OptDescr Opts]
pluginOptions =
    [
      [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char
'H'] [[Char]
"High"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
High [Char]
"number") [Char]
"The high threshold"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char
'L'] [[Char]
"Low"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
Low [Char]
"number") [Char]
"The low threshold"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"h" [[Char]
"high"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
HighColor [Char]
"color number") [Char]
"Color for the high threshold: ex \"#FF0000\""
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"n" [[Char]
"normal"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
NormalColor [Char]
"color number") [Char]
"Color for the normal threshold: ex \"#00FF00\""
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"l" [[Char]
"low"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
LowColor [Char]
"color number") [Char]
"Color for the low threshold: ex \"#0000FF\""
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"t" [[Char]
"template"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
Template [Char]
"output template") [Char]
"Output template."
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"S" [[Char]
"suffix"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
UseSuffix [Char]
"True/False") [Char]
"Use % to display percents or other suffixes."
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"d" [[Char]
"ddigits"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
DecDigits [Char]
"decimal digits") [Char]
"Number of decimal digits to display."
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"p" [[Char]
"ppad"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
PercentPad [Char]
"percent padding") [Char]
"Minimum percentage width."
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"m" [[Char]
"minwidth"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
MinWidth [Char]
"minimum width") [Char]
"Minimum field width"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"M" [[Char]
"maxwidth"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
MaxWidth [Char]
"maximum width") [Char]
"Maximum field width"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"w" [[Char]
"width"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
Width [Char]
"fixed width") [Char]
"Fixed field width"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"e" [[Char]
"maxwidthellipsis"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
WidthEllipsis [Char]
"Maximum width ellipsis") [Char]
"Ellipsis to be added to the field when it has reached its max width."
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"c" [[Char]
"padchars"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
PadChars [Char]
"padding chars") [Char]
"Characters to use for padding"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"a" [[Char]
"align"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
PadAlign [Char]
"padding alignment") [Char]
"'l' for left padding, 'r' for right"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"b" [[Char]
"bback"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
BarBack [Char]
"bar background") [Char]
"Characters used to draw bar backgrounds"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"f" [[Char]
"bfore"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
BarFore [Char]
"bar foreground") [Char]
"Characters used to draw bar foregrounds"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"W" [[Char]
"bwidth"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
BarWidth [Char]
"bar width") [Char]
"Bar width"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"x" [[Char]
"nastring"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
NAString [Char]
"N/A string") [Char]
"String used when the monitor is not available"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"T" [[Char]
"maxtwidth"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
MaxTotalWidth [Char]
"Maximum total width") [Char]
"Maximum total width"
    , [Char] -> [[Char]] -> ArgDescr Opts -> [Char] -> OptDescr Opts
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"E" [[Char]
"maxtwidthellipsis"] (([Char] -> Opts) -> [Char] -> ArgDescr Opts
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg [Char] -> Opts
MaxTotalWidthEllipsis [Char]
"Maximum total width ellipsis") [Char]
"Ellipsis to be added to the total text when it has reached its max width."
    ]

-- | Get all argument values out of a list of arguments.
getArgvs :: [String] -> [String]
getArgvs :: [[Char]] -> [[Char]]
getArgvs [[Char]]
args =
    case ArgOrder Opts
-> [OptDescr Opts] -> [[Char]] -> ([Opts], [[Char]], [[Char]])
forall a.
ArgOrder a -> [OptDescr a] -> [[Char]] -> ([a], [[Char]], [[Char]])
getOpt ArgOrder Opts
forall a. ArgOrder a
Permute [OptDescr Opts]
pluginOptions [[Char]]
args of
        ([Opts]
_, [[Char]]
n, []  ) -> [[Char]]
n
        ([Opts]
_, [[Char]]
_, [[Char]]
errs) -> [[Char]]
errs



doArgs :: [String]
       -> ([String] -> Monitor String)
       -> ([String] -> Monitor Bool)
       -> Monitor String
doArgs :: [[Char]]
-> ([[Char]] -> Monitor [Char])
-> ([[Char]] -> Monitor Bool)
-> Monitor [Char]
doArgs [[Char]]
args [[Char]] -> Monitor [Char]
action [[Char]] -> Monitor Bool
detect =
    case ArgOrder Opts
-> [OptDescr Opts] -> [[Char]] -> ([Opts], [[Char]], [[Char]])
forall a.
ArgOrder a -> [OptDescr a] -> [[Char]] -> ([a], [[Char]], [[Char]])
getOpt ArgOrder Opts
forall a. ArgOrder a
Permute [OptDescr Opts]
pluginOptions [[Char]]
args of
      ([Opts]
o, [[Char]]
n, [])   -> do [Opts] -> Monitor ()
doConfigOptions [Opts]
o
                         Bool
ready <- [[Char]] -> Monitor Bool
detect [[Char]]
n
                         if Bool
ready
                            then [[Char]] -> Monitor [Char]
action [[Char]]
n
                            else [Char] -> Monitor [Char]
forall (m :: * -> *) a. Monad m => a -> m a
return [Char]
"<Waiting...>"
      ([Opts]
_, [[Char]]
_, [[Char]]
errs) -> [Char] -> Monitor [Char]
forall (m :: * -> *) a. Monad m => a -> m a
return ([[Char]] -> [Char]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Char]]
errs)

doConfigOptions :: [Opts] -> Monitor ()
doConfigOptions :: [Opts] -> Monitor ()
doConfigOptions [] = IO () -> Monitor ()
forall a. IO a -> Monitor a
io (IO () -> Monitor ()) -> IO () -> Monitor ()
forall a b. (a -> b) -> a -> b
$ () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
doConfigOptions (Opts
o:[Opts]
oo) =
    do let next :: Monitor ()
next = [Opts] -> Monitor ()
doConfigOptions [Opts]
oo
           nz :: [Char] -> a
nz [Char]
s = let x :: a
x = [Char] -> a
forall a. Read a => [Char] -> a
read [Char]
s in a -> a -> a
forall a. Ord a => a -> a -> a
max a
0 a
x
           bool :: [Char] -> Bool
bool = ([Char] -> [[Char]] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [[Char]
"True", [Char]
"true", [Char]
"Yes", [Char]
"yes", [Char]
"On", [Char]
"on"])
       (case Opts
o of
          High                  [Char]
h -> Int -> Selector Int -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Int
forall a. Read a => [Char] -> a
read [Char]
h) Selector Int
high
          Low                   [Char]
l -> Int -> Selector Int -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Int
forall a. Read a => [Char] -> a
read [Char]
l) Selector Int
low
          HighColor             [Char]
c -> Maybe [Char] -> Selector (Maybe [Char]) -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Maybe [Char]
forall a. a -> Maybe a
Just [Char]
c) Selector (Maybe [Char])
highColor
          NormalColor           [Char]
c -> Maybe [Char] -> Selector (Maybe [Char]) -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Maybe [Char]
forall a. a -> Maybe a
Just [Char]
c) Selector (Maybe [Char])
normalColor
          LowColor              [Char]
c -> Maybe [Char] -> Selector (Maybe [Char]) -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Maybe [Char]
forall a. a -> Maybe a
Just [Char]
c) Selector (Maybe [Char])
lowColor
          Template              [Char]
t -> [Char] -> Selector [Char] -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue [Char]
t Selector [Char]
template
          PercentPad            [Char]
p -> Int -> Selector Int -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Int
forall a. (Ord a, Num a, Read a) => [Char] -> a
nz [Char]
p) Selector Int
ppad
          DecDigits             [Char]
d -> Int -> Selector Int -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Int
forall a. (Ord a, Num a, Read a) => [Char] -> a
nz [Char]
d) Selector Int
decDigits
          MinWidth              [Char]
w -> Int -> Selector Int -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Int
forall a. (Ord a, Num a, Read a) => [Char] -> a
nz [Char]
w) Selector Int
minWidth
          MaxWidth              [Char]
w -> Int -> Selector Int -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Int
forall a. (Ord a, Num a, Read a) => [Char] -> a
nz [Char]
w) Selector Int
maxWidth
          Width                 [Char]
w -> Int -> Selector Int -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Int
forall a. (Ord a, Num a, Read a) => [Char] -> a
nz [Char]
w) Selector Int
minWidth Monitor () -> Monitor () -> Monitor ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
                                   Int -> Selector Int -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Int
forall a. (Ord a, Num a, Read a) => [Char] -> a
nz [Char]
w) Selector Int
maxWidth
          WidthEllipsis         [Char]
e -> [Char] -> Selector [Char] -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue [Char]
e Selector [Char]
maxWidthEllipsis
          PadChars              [Char]
s -> [Char] -> Selector [Char] -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue [Char]
s Selector [Char]
padChars
          PadAlign              [Char]
a -> Bool -> Selector Bool -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char]
"r" [Char] -> [Char] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` [Char]
a) Selector Bool
padRight
          BarBack               [Char]
s -> [Char] -> Selector [Char] -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue [Char]
s Selector [Char]
barBack
          BarFore               [Char]
s -> [Char] -> Selector [Char] -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue [Char]
s Selector [Char]
barFore
          BarWidth              [Char]
w -> Int -> Selector Int -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Int
forall a. (Ord a, Num a, Read a) => [Char] -> a
nz [Char]
w) Selector Int
barWidth
          UseSuffix             [Char]
u -> Bool -> Selector Bool -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Bool
bool [Char]
u) Selector Bool
useSuffix
          NAString              [Char]
s -> [Char] -> Selector [Char] -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue [Char]
s Selector [Char]
naString
          MaxTotalWidth         [Char]
w -> Int -> Selector Int -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue ([Char] -> Int
forall a. (Ord a, Num a, Read a) => [Char] -> a
nz [Char]
w) Selector Int
maxTotalWidth
          MaxTotalWidthEllipsis [Char]
e -> [Char] -> Selector [Char] -> Monitor ()
forall a. a -> Selector a -> Monitor ()
setConfigValue [Char]
e Selector [Char]
maxTotalWidthEllipsis) Monitor () -> Monitor () -> Monitor ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Monitor ()
next

runM :: [String] -> IO MConfig -> ([String] -> Monitor String) -> Int
        -> (String -> IO ()) -> IO ()
runM :: [[Char]]
-> IO MConfig
-> ([[Char]] -> Monitor [Char])
-> Int
-> ([Char] -> IO ())
-> IO ()
runM [[Char]]
args IO MConfig
conf [[Char]] -> Monitor [Char]
action Int
r = [[Char]]
-> IO MConfig
-> ([[Char]] -> Monitor [Char])
-> (IO () -> IO ())
-> ([Char] -> IO ())
-> IO ()
runML [[Char]]
args IO MConfig
conf [[Char]] -> Monitor [Char]
action (Int -> IO () -> IO ()
doEveryTenthSeconds Int
r)

runMD :: [String] -> IO MConfig -> ([String] -> Monitor String) -> Int
        -> ([String] -> Monitor Bool) -> (String -> IO ()) -> IO ()
runMD :: [[Char]]
-> IO MConfig
-> ([[Char]] -> Monitor [Char])
-> Int
-> ([[Char]] -> Monitor Bool)
-> ([Char] -> IO ())
-> IO ()
runMD [[Char]]
args IO MConfig
conf [[Char]] -> Monitor [Char]
action Int
r = [[Char]]
-> IO MConfig
-> ([[Char]] -> Monitor [Char])
-> (IO () -> IO ())
-> ([[Char]] -> Monitor Bool)
-> ([Char] -> IO ())
-> IO ()
runMLD [[Char]]
args IO MConfig
conf [[Char]] -> Monitor [Char]
action (Int -> IO () -> IO ()
doEveryTenthSeconds Int
r)

runMB :: [String] -> IO MConfig -> ([String] -> Monitor String) -> IO ()
        -> (String -> IO ()) -> IO ()
runMB :: [[Char]]
-> IO MConfig
-> ([[Char]] -> Monitor [Char])
-> IO ()
-> ([Char] -> IO ())
-> IO ()
runMB [[Char]]
args IO MConfig
conf [[Char]] -> Monitor [Char]
action IO ()
wait = [[Char]]
-> IO MConfig
-> ([[Char]] -> Monitor [Char])
-> IO ()
-> ([[Char]] -> Monitor Bool)
-> ([Char] -> IO ())
-> IO ()
runMBD [[Char]]
args IO MConfig
conf [[Char]] -> Monitor [Char]
action IO ()
wait (\[[Char]]
_ -> Bool -> Monitor Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True)

runMBD :: [String] -> IO MConfig -> ([String] -> Monitor String) -> IO ()
        -> ([String] -> Monitor Bool) -> (String -> IO ()) -> IO ()
runMBD :: [[Char]]
-> IO MConfig
-> ([[Char]] -> Monitor [Char])
-> IO ()
-> ([[Char]] -> Monitor Bool)
-> ([Char] -> IO ())
-> IO ()
runMBD [[Char]]
args IO MConfig
conf [[Char]] -> Monitor [Char]
action IO ()
wait [[Char]] -> Monitor Bool
detect [Char] -> IO ()
cb = (SomeException -> IO ()) -> IO () -> IO ()
forall e a. Exception e => (e -> IO a) -> IO a -> IO a
handle ([Char] -> IO ()
cb ([Char] -> IO ())
-> (SomeException -> [Char]) -> SomeException -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeException -> [Char]
showException) IO ()
forall b. IO b
loop
  where ac :: Monitor [Char]
ac = [[Char]]
-> ([[Char]] -> Monitor [Char])
-> ([[Char]] -> Monitor Bool)
-> Monitor [Char]
doArgs [[Char]]
args [[Char]] -> Monitor [Char]
action [[Char]] -> Monitor Bool
detect
        loop :: IO b
loop = IO MConfig
conf IO MConfig -> (MConfig -> IO [Char]) -> IO [Char]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Monitor [Char] -> MConfig -> IO [Char]
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT Monitor [Char]
ac IO [Char] -> ([Char] -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> IO ()
cb IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> IO ()
wait IO () -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> IO b
loop

runML :: [String] -> IO MConfig -> ([String] -> Monitor String)
      -> (IO () -> IO ()) -> (String -> IO ()) -> IO ()
runML :: [[Char]]
-> IO MConfig
-> ([[Char]] -> Monitor [Char])
-> (IO () -> IO ())
-> ([Char] -> IO ())
-> IO ()
runML [[Char]]
args IO MConfig
conf [[Char]] -> Monitor [Char]
action IO () -> IO ()
looper = [[Char]]
-> IO MConfig
-> ([[Char]] -> Monitor [Char])
-> (IO () -> IO ())
-> ([[Char]] -> Monitor Bool)
-> ([Char] -> IO ())
-> IO ()
runMLD [[Char]]
args IO MConfig
conf [[Char]] -> Monitor [Char]
action IO () -> IO ()
looper (\[[Char]]
_ -> Bool -> Monitor Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True)

runMLD :: [String] -> IO MConfig -> ([String] -> Monitor String)
       -> (IO () -> IO ()) -> ([String] -> Monitor Bool) -> (String -> IO ())
       -> IO ()
runMLD :: [[Char]]
-> IO MConfig
-> ([[Char]] -> Monitor [Char])
-> (IO () -> IO ())
-> ([[Char]] -> Monitor Bool)
-> ([Char] -> IO ())
-> IO ()
runMLD [[Char]]
args IO MConfig
conf [[Char]] -> Monitor [Char]
action IO () -> IO ()
looper [[Char]] -> Monitor Bool
detect [Char] -> IO ()
cb = (SomeException -> IO ()) -> IO () -> IO ()
forall e a. Exception e => (e -> IO a) -> IO a -> IO a
handle ([Char] -> IO ()
cb ([Char] -> IO ())
-> (SomeException -> [Char]) -> SomeException -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeException -> [Char]
showException) IO ()
loop
  where ac :: Monitor [Char]
ac = [[Char]]
-> ([[Char]] -> Monitor [Char])
-> ([[Char]] -> Monitor Bool)
-> Monitor [Char]
doArgs [[Char]]
args [[Char]] -> Monitor [Char]
action [[Char]] -> Monitor Bool
detect
        loop :: IO ()
loop = IO () -> IO ()
looper (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ IO MConfig
conf IO MConfig -> (MConfig -> IO [Char]) -> IO [Char]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Monitor [Char] -> MConfig -> IO [Char]
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT Monitor [Char]
ac IO [Char] -> ([Char] -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> IO ()
cb

showException :: SomeException -> String
showException :: SomeException -> [Char]
showException = ([Char]
"error: "[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++) ([Char] -> [Char])
-> (SomeException -> [Char]) -> SomeException -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeException -> [Char]
forall a. Show a => a -> [Char]
show (SomeException -> [Char])
-> (SomeException -> SomeException) -> SomeException -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SomeException -> SomeException -> SomeException)
-> SomeException -> SomeException -> SomeException
forall a b c. (a -> b -> c) -> b -> a -> c
flip SomeException -> SomeException -> SomeException
forall a. a -> a -> a
asTypeOf SomeException
forall a. HasCallStack => a
undefined

computeMonitorConfig :: [String] -> IO MConfig -> IO MonitorConfig
computeMonitorConfig :: [[Char]] -> IO MConfig -> IO MonitorConfig
computeMonitorConfig [[Char]]
args IO MConfig
mconfig = do
  MConfig
newConfig <- [[Char]] -> IO MConfig -> IO MConfig
getMConfig [[Char]]
args IO MConfig
mconfig
  MConfig -> IO MonitorConfig
getMonitorConfig MConfig
newConfig

getMConfig :: [String] -> IO MConfig -> IO MConfig
getMConfig :: [[Char]] -> IO MConfig -> IO MConfig
getMConfig [[Char]]
args IO MConfig
mconfig = do
  MConfig
config <- IO MConfig
mconfig
  ReaderT MConfig IO MConfig -> MConfig -> IO MConfig
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ([[Char]] -> Monitor ()
updateOptions [[Char]]
args Monitor ()
-> ReaderT MConfig IO MConfig -> ReaderT MConfig IO MConfig
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ReaderT MConfig IO MConfig
forall r (m :: * -> *). MonadReader r m => m r
ask) MConfig
config

updateOptions :: [String] -> Monitor ()
updateOptions :: [[Char]] -> Monitor ()
updateOptions [[Char]]
args= case ArgOrder Opts
-> [OptDescr Opts] -> [[Char]] -> ([Opts], [[Char]], [[Char]])
forall a.
ArgOrder a -> [OptDescr a] -> [[Char]] -> ([a], [[Char]], [[Char]])
getOpt ArgOrder Opts
forall a. ArgOrder a
Permute [OptDescr Opts]
pluginOptions [[Char]]
args of
                      ([Opts]
o, [[Char]]
_, []) -> [Opts] -> Monitor ()
doConfigOptions [Opts]
o
                      ([Opts], [[Char]], [[Char]])
_ -> () -> Monitor ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()