forked from OSS/graphql
36 lines
1.0 KiB
Haskell
36 lines
1.0 KiB
Haskell
|
module Language.GraphQL.Trans where
|
||
|
|
||
|
import Control.Applicative (Alternative(..))
|
||
|
import Control.Monad (MonadPlus(..))
|
||
|
import Control.Monad.IO.Class (MonadIO(..))
|
||
|
import Control.Monad.Trans.Class (MonadTrans(..))
|
||
|
import Control.Monad.Trans.Except (ExceptT)
|
||
|
import Data.Text (Text)
|
||
|
|
||
|
newtype ActionT m a = ActionT { runActionT :: ExceptT Text m a }
|
||
|
|
||
|
instance Functor m => Functor (ActionT m) where
|
||
|
fmap f = ActionT . fmap f . runActionT
|
||
|
|
||
|
instance Monad m => Applicative (ActionT m) where
|
||
|
pure = ActionT . pure
|
||
|
(ActionT f) <*> (ActionT x) = ActionT $ f <*> x
|
||
|
|
||
|
instance Monad m => Monad (ActionT m) where
|
||
|
return = pure
|
||
|
(ActionT action) >>= f = ActionT $ action >>= runActionT . f
|
||
|
|
||
|
instance MonadTrans ActionT where
|
||
|
lift = ActionT . lift
|
||
|
|
||
|
instance MonadIO m => MonadIO (ActionT m) where
|
||
|
liftIO = lift . liftIO
|
||
|
|
||
|
instance Monad m => Alternative (ActionT m) where
|
||
|
empty = ActionT empty
|
||
|
(ActionT x) <|> (ActionT y) = ActionT $ x <|> y
|
||
|
|
||
|
instance Monad m => MonadPlus (ActionT m) where
|
||
|
mzero = empty
|
||
|
mplus = (<|>)
|