lhae-0.0.2: src/Controller.hs
module Controller (CtrlData,Controller,new,onView,onModel,onGridView
,onGridModel,setOnConfig,getFromConfig
,currentConfig)
where
import Control.Monad.Reader
import Data.IORef
import Config (Config)
import View (View)
import qualified View as V
import qualified View.Component.Grid as GridV
import Model (Model)
import qualified Model as M
import qualified Model.Grid as GridM
data CtrlData = CtrlData { config :: IORef Config
, model :: Model
, view :: View
}
type Controller a = ReaderT CtrlData IO a
new :: Config -> Model -> View -> IO CtrlData
new config model view = do
configRef <- newIORef config
return $ CtrlData configRef model view
currentConfig :: Controller Config
currentConfig = asks config >>= liftIO . readIORef
onView :: (View -> IO a) -> Controller a
onView f = asks view >>= liftIO . f
onModel :: (Model -> IO a) -> Controller a
onModel f = asks model >>= liftIO . f
onGridView :: (GridV.Grid -> IO a) -> Controller a
onGridView f = asks view >>= liftIO . flip V.onGrid f
onGridModel :: (GridM.Grid -> IO a) -> Controller a
onGridModel f = asks model >>= liftIO . flip M.onGrid f
setOnConfig :: (Config -> Config) -> Controller ()
setOnConfig setter = do
config <- asks config
liftIO $ modifyIORef config setter
getFromConfig :: (Config -> a) -> Controller a
getFromConfig getter =
asks config >>= liftIO . readIORef >>= return . getter