module Network.Wai.Middleware.Routes.Handler
( HandlerM()
, runHandlerM
, request
, master
, next
)
where
import Data.Conduit (ResourceT)
import Network.Wai (Request, Response)
import Control.Monad.Reader (ReaderT, ask, runReaderT, MonadReader, MonadIO, lift)
import Network.Wai.Middleware.Routes.Routes (RequestData, Handler, waiReq, runNext)
newtype HandlerM master a = H { extractH :: ReaderT (HandlerState master) (ResourceT IO) a }
deriving (Monad, MonadIO, Functor, MonadReader (HandlerState master))
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