orgstat-0.1.5: src/OrgStat/WorkMonad.hs
{-# LANGUAGE TemplateHaskell #-}
-- | Definition for main work scope
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 OrgStat.Ast (Org)
import OrgStat.CLI (CommonArgs)
import OrgStat.Config (OrgStatConfig)
-- | Read-only app configuration.
data WorkConfig = WorkConfig
{ _wcConfig :: OrgStatConfig
, _wcCommonArgs :: CommonArgs
}
makeLenses ''WorkConfig
-- | State component of application.
data WorkData = WorkData
{ _wdReadFiles :: HashMap FilePath (Text, Org)
-- ^ Org files that were read. Elements are pairs of type (file
-- basename, content). Keys are paths.
, _wdResolvedScopes :: HashMap Text Org
-- ^ Scope is just plain read files.
, _wdResolvedReports :: HashMap Text Org
-- ^ Report is a filtered (with scope modifiers and clock
-- limitations) scope.
}
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
, MonadThrow
, MonadCatch
)
runWorkM :: MonadIO m => WorkConfig -> WorkM a -> m a
runWorkM config action =
liftIO $ runReaderT (evalStateT (getWorkM action) def) config