module Controller (CtrlData,Controller,new,onView,onModel,onGridView ,onGridModel,setOnConfig,getFromConfig ,currentConfig,withCtrlData,ctrlData) 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 withCtrlData :: Controller a -> CtrlData -> IO a withCtrlData = runReaderT ctrlData :: Controller CtrlData ctrlData = ask