servant/servant-server/src/Servant/Server/Internal/Handler.hs

49 lines
1.6 KiB
Haskell
Raw Normal View History

2017-01-16 10:44:25 +01:00
{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Servant.Server.Internal.Handler where
2018-06-29 21:08:26 +02:00
import Prelude ()
import Prelude.Compat
import Control.Monad.Base
(MonadBase (..))
import Control.Monad.Catch
2018-11-03 21:41:23 +01:00
(MonadCatch, MonadMask, MonadThrow)
2018-06-29 21:08:26 +02:00
import Control.Monad.Error.Class
(MonadError)
import Control.Monad.IO.Class
(MonadIO)
import Control.Monad.Trans.Control
(MonadBaseControl (..))
import Control.Monad.Trans.Except
(ExceptT, runExceptT)
import GHC.Generics
(Generic)
import Servant.Server.Internal.ServerError
(ServerError)
2017-01-16 10:44:25 +01:00
newtype Handler a = Handler { runHandler' :: ExceptT ServerError IO a }
2017-01-16 10:44:25 +01:00
deriving
( Functor, Applicative, Monad, MonadIO, Generic
, MonadError ServerError
2018-11-03 21:41:23 +01:00
, MonadThrow, MonadCatch, MonadMask
2017-01-16 10:44:25 +01:00
)
instance MonadBase IO Handler where
liftBase = Handler . liftBase
instance MonadBaseControl IO Handler where
type StM Handler a = Either ServerError a
2017-01-16 10:44:25 +01:00
-- liftBaseWith :: (RunInBase Handler IO -> IO a) -> Handler a
liftBaseWith f = Handler (liftBaseWith (\g -> f (g . runHandler')))
-- restoreM :: StM Handler a -> Handler a
restoreM st = Handler (restoreM st)
runHandler :: Handler a -> IO (Either ServerError a)
2017-01-16 10:44:25 +01:00
runHandler = runExceptT . runHandler'