module OrgStat.WorkMonad
( WorkConfig (..)
, wcConfig
, wcCommonArgs
, WorkData
, wdReadFiles
, wdResolvedScopes
, wdResolvedReports
, WorkM (..)
, runWorkM
) where
import Universum
import Control.Lens (makeLenses)
import Data.Default (Default (def))
import qualified System.Wlog as W
import OrgStat.Ast (Org)
import OrgStat.CLI (CommonArgs)
import OrgStat.Config (OrgStatConfig)
data WorkConfig = WorkConfig
{ _wcConfig :: OrgStatConfig
, _wcCommonArgs :: CommonArgs
}
makeLenses ''WorkConfig
data WorkData = WorkData
{ _wdReadFiles :: HashMap FilePath (Text, Org)
, _wdResolvedScopes :: HashMap Text Org
, _wdResolvedReports :: HashMap Text Org
}
makeLenses ''WorkData
instance Default WorkData where
def = WorkData mempty mempty mempty
newtype WorkM a = WorkM
{ getWorkM :: StateT WorkData (ReaderT WorkConfig IO) a
} deriving ( Functor
, Applicative
, Monad
, MonadIO
, MonadReader WorkConfig
, MonadState WorkData
, W.CanLog
, MonadThrow
, MonadCatch
)
instance W.HasLoggerName WorkM where
getLoggerName = pure $ W.LoggerName "OrgStat"
modifyLoggerName _ = identity
runWorkM :: MonadIO m => WorkConfig -> WorkM a -> m a
runWorkM config action =
liftIO $ runReaderT (evalStateT (getWorkM action) def) config