summaryrefslogtreecommitdiff
path: root/src/Language/GraphQL/Trans.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Language/GraphQL/Trans.hs')
-rw-r--r--src/Language/GraphQL/Trans.hs35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/Language/GraphQL/Trans.hs b/src/Language/GraphQL/Trans.hs
new file mode 100644
index 0000000..f0fcefb
--- /dev/null
+++ b/src/Language/GraphQL/Trans.hs
@@ -0,0 +1,35 @@
+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 = (<|>)