module Network.Wai.Middleware.Routes.Handler
( HandlerM()
, runHandlerM
, request
, master
, next
)
where
import Network.Wai (Request, Response)
import Control.Monad.Reader (ReaderT, ask, runReaderT, MonadReader, MonadIO, lift, MonadTrans)
import Network.Wai.Middleware.Routes.Routes (RequestData, Handler, waiReq, runNext)
newtype HandlerMI master m a = H { extractH :: ReaderT (HandlerState master) m a }
deriving (Monad, MonadIO, Functor, MonadTrans, MonadReader (HandlerState master))
type HandlerM master a = HandlerMI master IO a
data HandlerState master = HandlerState
{ getMaster :: master
, getRequestData :: RequestData
}
runHandlerM :: HandlerM master Response -> Handler master
runHandlerM h m r = runReaderT (extractH h) (HandlerState m r)
master :: HandlerM master master
master = ask >>= return . getMaster
request :: HandlerM master Request
request = ask >>= return . waiReq . getRequestData
next :: HandlerM master Response
next = ask >>= H . lift . runNext . getRequestData