------------------------------------------------------------------------------
-- |
-- Module: Xmobar.Plugins.Monitors.Types
-- 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:31
--
--
-- Type definitions and constructors for Monitors
--
------------------------------------------------------------------------------


module Xmobar.Plugins.Monitors.Common.Types ( Monitor
                                            , MConfig (..)
                                            , Opts (..)
                                            , Selector
                                            , setConfigValue
                                            , getConfigValue
                                            , mkMConfig
                                            , io
                                            ) where

import Control.Monad.Reader (ReaderT, ask, liftIO)
import Data.IORef (IORef, modifyIORef, newIORef, readIORef)


type Monitor a = ReaderT MConfig IO a

io :: IO a -> Monitor a
io :: IO a -> Monitor a
io = IO a -> Monitor a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO

data MConfig =
    MC { MConfig -> IORef (Maybe String)
normalColor :: IORef (Maybe String)
       , MConfig -> IORef Int
low :: IORef Int
       , MConfig -> IORef (Maybe String)
lowColor :: IORef (Maybe String)
       , MConfig -> IORef Int
high :: IORef Int
       , MConfig -> IORef (Maybe String)
highColor :: IORef (Maybe String)
       , MConfig -> IORef String
template :: IORef String
       , MConfig -> IORef [String]
export :: IORef [String]
       , MConfig -> IORef Int
ppad :: IORef Int
       , MConfig -> IORef Int
decDigits :: IORef Int
       , MConfig -> IORef Int
minWidth :: IORef Int
       , MConfig -> IORef Int
maxWidth :: IORef Int
       , MConfig -> IORef String
maxWidthEllipsis :: IORef String
       , MConfig -> IORef String
padChars :: IORef String
       , MConfig -> IORef Bool
padRight :: IORef Bool
       , MConfig -> IORef String
barBack :: IORef String
       , MConfig -> IORef String
barFore :: IORef String
       , MConfig -> IORef Int
barWidth :: IORef Int
       , MConfig -> IORef Bool
useSuffix :: IORef Bool
       , MConfig -> IORef String
naString :: IORef String
       , MConfig -> IORef Int
maxTotalWidth :: IORef Int
       , MConfig -> IORef String
maxTotalWidthEllipsis :: IORef String
       }

-- | from 'http:\/\/www.haskell.org\/hawiki\/MonadState'
type Selector a = MConfig -> IORef a

sel :: Selector a -> Monitor a
sel :: Selector a -> Monitor a
sel Selector a
s =
    do MConfig
hs <- ReaderT MConfig IO MConfig
forall r (m :: * -> *). MonadReader r m => m r
ask
       IO a -> Monitor a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> Monitor a) -> IO a -> Monitor a
forall a b. (a -> b) -> a -> b
$ IORef a -> IO a
forall a. IORef a -> IO a
readIORef (Selector a
s MConfig
hs)

mods :: Selector a -> (a -> a) -> Monitor ()
mods :: Selector a -> (a -> a) -> Monitor ()
mods Selector a
s a -> a
m =
    do MConfig
v <- ReaderT MConfig IO MConfig
forall r (m :: * -> *). MonadReader r m => m r
ask
       IO () -> Monitor ()
forall a. IO a -> Monitor a
io (IO () -> Monitor ()) -> IO () -> Monitor ()
forall a b. (a -> b) -> a -> b
$ IORef a -> (a -> a) -> IO ()
forall a. IORef a -> (a -> a) -> IO ()
modifyIORef (Selector a
s MConfig
v) a -> a
m

setConfigValue :: a -> Selector a -> Monitor ()
setConfigValue :: a -> Selector a -> Monitor ()
setConfigValue a
v Selector a
s =
       Selector a -> (a -> a) -> Monitor ()
forall a. Selector a -> (a -> a) -> Monitor ()
mods Selector a
s (a -> a -> a
forall a b. a -> b -> a
const a
v)

getConfigValue :: Selector a -> Monitor a
getConfigValue :: Selector a -> Monitor a
getConfigValue = Selector a -> Monitor a
forall a. Selector a -> Monitor a
sel

mkMConfig :: String
          -> [String]
          -> IO MConfig
mkMConfig :: String -> [String] -> IO MConfig
mkMConfig String
tmpl [String]
exprts =
    do IORef (Maybe String)
lc <- Maybe String -> IO (IORef (Maybe String))
forall a. a -> IO (IORef a)
newIORef Maybe String
forall a. Maybe a
Nothing
       IORef Int
l  <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
33
       IORef (Maybe String)
nc <- Maybe String -> IO (IORef (Maybe String))
forall a. a -> IO (IORef a)
newIORef Maybe String
forall a. Maybe a
Nothing
       IORef Int
h  <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
66
       IORef (Maybe String)
hc <- Maybe String -> IO (IORef (Maybe String))
forall a. a -> IO (IORef a)
newIORef Maybe String
forall a. Maybe a
Nothing
       IORef String
t  <- String -> IO (IORef String)
forall a. a -> IO (IORef a)
newIORef String
tmpl
       IORef [String]
e  <- [String] -> IO (IORef [String])
forall a. a -> IO (IORef a)
newIORef [String]
exprts
       IORef Int
p  <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
0
       IORef Int
d  <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
0
       IORef Int
mn <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
0
       IORef Int
mx <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
0
       IORef String
mel <- String -> IO (IORef String)
forall a. a -> IO (IORef a)
newIORef String
""
       IORef String
pc <- String -> IO (IORef String)
forall a. a -> IO (IORef a)
newIORef String
" "
       IORef Bool
pr <- Bool -> IO (IORef Bool)
forall a. a -> IO (IORef a)
newIORef Bool
False
       IORef String
bb <- String -> IO (IORef String)
forall a. a -> IO (IORef a)
newIORef String
":"
       IORef String
bf <- String -> IO (IORef String)
forall a. a -> IO (IORef a)
newIORef String
"#"
       IORef Int
bw <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
10
       IORef Bool
up <- Bool -> IO (IORef Bool)
forall a. a -> IO (IORef a)
newIORef Bool
False
       IORef String
na <- String -> IO (IORef String)
forall a. a -> IO (IORef a)
newIORef String
"N/A"
       IORef Int
mt <- Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
0
       IORef String
mtel <- String -> IO (IORef String)
forall a. a -> IO (IORef a)
newIORef String
""
       MConfig -> IO MConfig
forall (m :: * -> *) a. Monad m => a -> m a
return (MConfig -> IO MConfig) -> MConfig -> IO MConfig
forall a b. (a -> b) -> a -> b
$ IORef (Maybe String)
-> IORef Int
-> IORef (Maybe String)
-> IORef Int
-> IORef (Maybe String)
-> IORef String
-> IORef [String]
-> IORef Int
-> IORef Int
-> IORef Int
-> IORef Int
-> IORef String
-> IORef String
-> IORef Bool
-> IORef String
-> IORef String
-> IORef Int
-> IORef Bool
-> IORef String
-> IORef Int
-> IORef String
-> MConfig
MC IORef (Maybe String)
nc IORef Int
l IORef (Maybe String)
lc IORef Int
h IORef (Maybe String)
hc IORef String
t IORef [String]
e IORef Int
p IORef Int
d IORef Int
mn IORef Int
mx IORef String
mel IORef String
pc IORef Bool
pr IORef String
bb IORef String
bf IORef Int
bw IORef Bool
up IORef String
na IORef Int
mt IORef String
mtel

data Opts = HighColor String
          | NormalColor String
          | LowColor String
          | Low String
          | High String
          | Template String
          | PercentPad String
          | DecDigits String
          | MinWidth String
          | MaxWidth String
          | Width String
          | WidthEllipsis String
          | PadChars String
          | PadAlign String
          | BarBack String
          | BarFore String
          | BarWidth String
          | UseSuffix String
          | NAString String
          | MaxTotalWidth String
          | MaxTotalWidthEllipsis String