diff options
| author | Lupino <lmjubuntu@gmail.com> | 2017-02-23 11:03:08 +0800 |
|---|---|---|
| committer | Lupino <lmjubuntu@gmail.com> | 2017-02-23 11:08:47 +0800 |
| commit | 3be86bf69e0825c2df65862479d663b08f60e8ce (patch) | |
| tree | 44f93d5aab80640653f13e15f31b6cc1734a02cc | |
| parent | 642eab312f7b18619ff24e07a8863591f13ba07f (diff) | |
| download | graphql-3be86bf69e0825c2df65862479d663b08f60e8ce.tar.gz | |
Enable Monad for array and object resolver
When I use facebook/haxl, I can not find any way to the sub resolver.
so I add Monad resolver to support it.
| -rw-r--r-- | Data/GraphQL/Schema.hs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/Data/GraphQL/Schema.hs b/Data/GraphQL/Schema.hs index b8668d9..d9689e9 100644 --- a/Data/GraphQL/Schema.hs +++ b/Data/GraphQL/Schema.hs @@ -7,11 +7,15 @@ module Data.GraphQL.Schema , Resolver , Subs , object + , object' , objectA + , objectA' , scalar , scalarA , array + , array' , arrayA + , arrayA' , enum , enumA , resolvers @@ -61,6 +65,21 @@ objectA objectA name f fld@(Field _ _ args _ sels) = withField name (resolvers (f args) $ fields sels) fld +-- | Create a named 'Resolver' from a list of 'Resolver's. +object' :: (Alternative f, Monad f)=> Text -> f [Resolver f] -> Resolver f +object' name resolvs = objectA' name $ \case + [] -> resolvs + _ -> empty + +-- | Like 'object'' but also taking 'Argument's. +objectA' + :: (Alternative f, Monad f) + => Text -> ([Argument] -> f [Resolver f]) -> Resolver f +objectA' name f fld@(Field _ _ args _ sels) = do + resolvs <- f args + withField name (resolvers resolvs $ fields sels) fld + + -- | A scalar represents a primitive value, like a string or an integer. scalar :: (Alternative f, Aeson.ToJSON a) => Text -> a -> Resolver f scalar name s = scalarA name $ \case @@ -87,6 +106,20 @@ arrayA arrayA name f fld@(Field _ _ args _ sels) = withField name (joinErrs $ traverse (flip resolvers $ fields sels) $ f args) fld +-- | Like 'object'' but taking lists of 'Resolver's instead of a single list. +array' :: (Alternative f, Monad f) => Text -> f [[Resolver f]] -> Resolver f +array' name resolvs = arrayA' name $ \case + [] -> resolvs + _ -> empty + +-- | Like 'array'' but also taking 'Argument's. +arrayA' + :: (Alternative f, Monad f) + => Text -> ([Argument] -> f [[Resolver f]]) -> Resolver f +arrayA' name f fld@(Field _ _ args _ sels) = do + resolvs <- f args + withField name (joinErrs $ traverse (flip resolvers $ fields sels) $ resolvs) fld + -- | Represents one of a finite set of possible values. -- Used in place of a 'scalar' when the possible responses are easily enumerable. enum :: Alternative f => Text -> f [Text] -> Resolver f |
