diff options
| author | Eugen Wissner <belka@caraus.de> | 2020-06-29 13:14:23 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2020-06-29 13:14:23 +0200 |
| commit | 705e506c13b6c0f67ddf0195fa0d3256e7e4f9c3 (patch) | |
| tree | 58e41bdbd246fc5b947a848283d6688c7ddf636b /src/Language/GraphQL/Trans.hs | |
| parent | 9798b08b4c25685e92a7f537f68f35994a5a4899 (diff) | |
| download | graphql-705e506c13b6c0f67ddf0195fa0d3256e7e4f9c3.tar.gz | |
Combine Resolver and ActionT in ResolverT
Diffstat (limited to 'src/Language/GraphQL/Trans.hs')
| -rw-r--r-- | src/Language/GraphQL/Trans.hs | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/src/Language/GraphQL/Trans.hs b/src/Language/GraphQL/Trans.hs index fa7718a..2ec13be 100644 --- a/src/Language/GraphQL/Trans.hs +++ b/src/Language/GraphQL/Trans.hs @@ -1,7 +1,7 @@ -- | Monad transformer stack used by the @GraphQL@ resolvers. module Language.GraphQL.Trans ( argument - , ActionT(..) + , ResolverT(..) , Context(..) ) where @@ -26,42 +26,49 @@ data Context = Context } -- | Monad transformer stack used by the resolvers to provide error handling --- and resolution context (resolver arguments). -newtype ActionT m a = ActionT - { runActionT :: ExceptT Text (ReaderT Context m) a +-- and resolution context (resolver arguments). +-- +-- Resolves a 'Field' into a 'Value' with error information (if an error has +-- occurred). @m@ is an arbitrary monad, usually 'IO'. +-- +-- Resolving a field can result in a leaf value or an object, which is +-- represented as a list of nested resolvers, used to resolve the fields of that +-- object. +newtype ResolverT m a = ResolverT + { runResolverT :: ExceptT Text (ReaderT Context m) a } -instance Functor m => Functor (ActionT m) where - fmap f = ActionT . fmap f . runActionT +instance Functor m => Functor (ResolverT m) where + fmap f = ResolverT . fmap f . runResolverT -instance Monad m => Applicative (ActionT m) where - pure = ActionT . pure - (ActionT f) <*> (ActionT x) = ActionT $ f <*> x +instance Monad m => Applicative (ResolverT m) where + pure = ResolverT . pure + (ResolverT f) <*> (ResolverT x) = ResolverT $ f <*> x -instance Monad m => Monad (ActionT m) where +instance Monad m => Monad (ResolverT m) where return = pure - (ActionT action) >>= f = ActionT $ action >>= runActionT . f + (ResolverT action) >>= f = ResolverT $ action >>= runResolverT . f -instance MonadTrans ActionT where - lift = ActionT . lift . lift +instance MonadTrans ResolverT where + lift = ResolverT . lift . lift -instance MonadIO m => MonadIO (ActionT m) where +instance MonadIO m => MonadIO (ResolverT 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 => Alternative (ResolverT m) where + empty = ResolverT empty + (ResolverT x) <|> (ResolverT y) = ResolverT $ x <|> y -instance Monad m => MonadPlus (ActionT m) where +instance Monad m => MonadPlus (ResolverT m) where mzero = empty mplus = (<|>) -- | Retrieves an argument by its name. If the argument with this name couldn't -- be found, returns 'Null' (i.e. the argument is assumed to -- be optional then). -argument :: Monad m => Name -> ActionT m Value +argument :: Monad m => Name -> ResolverT m Value argument argumentName = do - argumentValue <- ActionT $ lift $ asks $ lookup . arguments + argumentValue <- ResolverT $ lift $ asks $ lookup . arguments pure $ fromMaybe Null argumentValue where lookup (Arguments argumentMap) = HashMap.lookup argumentName argumentMap |
