module Snap.Snaplet.Haxl
(haxlInit
,withHaxl
,HaxlEnv(..)
,HasHaxl(..)) where
import Control.Monad.CatchIO (MonadCatchIO)
import Control.Monad.Trans.Reader (ReaderT, ask)
import Haxl.Core (GenHaxl, runHaxl)
import qualified Haxl.Core.Env as E (Env)
import Snap (Handler, SnapletInit, get, liftIO, makeSnaplet)
data HaxlEnv u = HaxlEnv {en :: E.Env u}
class (MonadCatchIO m) => HasHaxl m where
getHaxlState :: m (HaxlEnv ())
instance HasHaxl (Handler b (HaxlEnv ())) where
getHaxlState = get
instance (MonadCatchIO m) => HasHaxl (ReaderT (HaxlEnv ()) m) where
getHaxlState = ask
haxlInit :: E.Env e -> SnapletInit b (HaxlEnv e)
haxlInit e = makeSnaplet "haxl" "Simple Haxl Snaplet" Nothing $ do
return $ HaxlEnv e
withHaxl :: (HasHaxl m) => GenHaxl () b -> m (b)
withHaxl f = do
envir <- getHaxlState
liftIO $ runHaxl (en envir) $ do f