packages feed

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