module Data.Morpheus.App.NamedResolvers
( ref,
object,
variant,
list,
refs,
enum,
queryResolvers,
getArgument,
NamedResolverFunction,
RootResolverValue,
ResultBuilder,
)
where
import qualified Data.HashMap.Lazy as HM
import Data.Morpheus.App.Internal.Resolving.Resolver (LiftOperation, Resolver, getArgument)
import Data.Morpheus.App.Internal.Resolving.RootResolverValue (RootResolverValue (..))
import Data.Morpheus.App.Internal.Resolving.Types
( NamedResolver (..),
NamedResolverRef (..),
NamedResolverResult (..),
ObjectTypeResolver (..),
ResolverMap,
ResolverValue (..),
mkEnum,
mkList,
)
import Data.Morpheus.Types.Internal.AST
( FieldName,
QUERY,
TypeName,
ValidValue,
)
enum :: TypeName -> ResolverValue m
enum :: TypeName -> ResolverValue m
enum = TypeName -> ResolverValue m
forall (m :: * -> *). TypeName -> ResolverValue m
mkEnum
list :: [ResolverValue m] -> ResolverValue m
list :: [ResolverValue m] -> ResolverValue m
list = [ResolverValue m] -> ResolverValue m
forall (m :: * -> *). [ResolverValue m] -> ResolverValue m
mkList
ref :: Applicative m => TypeName -> ValidValue -> ResolverValue m
ref :: TypeName -> ValidValue -> ResolverValue m
ref TypeName
typeName = m NamedResolverRef -> ResolverValue m
forall (m :: * -> *). m NamedResolverRef -> ResolverValue m
ResRef (m NamedResolverRef -> ResolverValue m)
-> (ValidValue -> m NamedResolverRef)
-> ValidValue
-> ResolverValue m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NamedResolverRef -> m NamedResolverRef
forall (f :: * -> *) a. Applicative f => a -> f a
pure (NamedResolverRef -> m NamedResolverRef)
-> (ValidValue -> NamedResolverRef)
-> ValidValue
-> m NamedResolverRef
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TypeName -> ValidValue -> NamedResolverRef
NamedResolverRef TypeName
typeName
refs :: Applicative m => TypeName -> [ValidValue] -> ResolverValue m
refs :: TypeName -> [ValidValue] -> ResolverValue m
refs TypeName
typeName = [ResolverValue m] -> ResolverValue m
forall (m :: * -> *). [ResolverValue m] -> ResolverValue m
mkList ([ResolverValue m] -> ResolverValue m)
-> ([ValidValue] -> [ResolverValue m])
-> [ValidValue]
-> ResolverValue m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ValidValue -> ResolverValue m)
-> [ValidValue] -> [ResolverValue m]
forall a b. (a -> b) -> [a] -> [b]
map (TypeName -> ValidValue -> ResolverValue m
forall (m :: * -> *).
Applicative m =>
TypeName -> ValidValue -> ResolverValue m
ref TypeName
typeName)
type NamedResolverFunction o e m = ValidValue -> Resolver o e m (ResultBuilder o e m)
object :: (LiftOperation o, Monad m) => [(FieldName, Resolver o e m (ResolverValue (Resolver o e m)))] -> Resolver o e m (ResultBuilder o e m)
object :: [(FieldName, Resolver o e m (ResolverValue (Resolver o e m)))]
-> Resolver o e m (ResultBuilder o e m)
object = ResultBuilder o e m -> Resolver o e m (ResultBuilder o e m)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ResultBuilder o e m -> Resolver o e m (ResultBuilder o e m))
-> ([(FieldName, Resolver o e m (ResolverValue (Resolver o e m)))]
-> ResultBuilder o e m)
-> [(FieldName, Resolver o e m (ResolverValue (Resolver o e m)))]
-> Resolver o e m (ResultBuilder o e m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(FieldName, Resolver o e m (ResolverValue (Resolver o e m)))]
-> ResultBuilder o e m
forall (o :: OperationType) e (m :: * -> *).
[(FieldName, Resolver o e m (ResolverValue (Resolver o e m)))]
-> ResultBuilder o e m
Object
variant :: (LiftOperation o, Monad m) => TypeName -> ValidValue -> Resolver o e m (ResultBuilder o e m)
variant :: TypeName -> ValidValue -> Resolver o e m (ResultBuilder o e m)
variant TypeName
tName = ResultBuilder o e m -> Resolver o e m (ResultBuilder o e m)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ResultBuilder o e m -> Resolver o e m (ResultBuilder o e m))
-> (ValidValue -> ResultBuilder o e m)
-> ValidValue
-> Resolver o e m (ResultBuilder o e m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TypeName -> ValidValue -> ResultBuilder o e m
forall (o :: OperationType) e (m :: * -> *).
TypeName -> ValidValue -> ResultBuilder o e m
Union TypeName
tName
queryResolvers :: Monad m => [(TypeName, NamedResolverFunction QUERY e m)] -> RootResolverValue e m
queryResolvers :: [(TypeName, NamedResolverFunction QUERY e m)]
-> RootResolverValue e m
queryResolvers = ResolverMap (Resolver QUERY e m) -> RootResolverValue e m
forall e (m :: * -> *).
ResolverMap (Resolver QUERY e m) -> RootResolverValue e m
NamedResolversValue (ResolverMap (Resolver QUERY e m) -> RootResolverValue e m)
-> ([(TypeName, NamedResolverFunction QUERY e m)]
-> ResolverMap (Resolver QUERY e m))
-> [(TypeName, NamedResolverFunction QUERY e m)]
-> RootResolverValue e m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(TypeName, NamedResolverFunction QUERY e m)]
-> ResolverMap (Resolver QUERY e m)
forall (o :: OperationType) (m :: * -> *) e.
(LiftOperation o, Monad m) =>
[(TypeName, NamedResolverFunction o e m)]
-> ResolverMap (Resolver o e m)
mkResolverMap
data ResultBuilder o e m
= Object [(FieldName, Resolver o e m (ResolverValue (Resolver o e m)))]
| Union TypeName ValidValue
mkResolverMap :: (LiftOperation o, Monad m) => [(TypeName, NamedResolverFunction o e m)] -> ResolverMap (Resolver o e m)
mkResolverMap :: [(TypeName, NamedResolverFunction o e m)]
-> ResolverMap (Resolver o e m)
mkResolverMap = [(TypeName, NamedResolver (Resolver o e m))]
-> ResolverMap (Resolver o e m)
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HM.fromList ([(TypeName, NamedResolver (Resolver o e m))]
-> ResolverMap (Resolver o e m))
-> ([(TypeName, NamedResolverFunction o e m)]
-> [(TypeName, NamedResolver (Resolver o e m))])
-> [(TypeName, NamedResolverFunction o e m)]
-> ResolverMap (Resolver o e m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((TypeName, NamedResolverFunction o e m)
-> (TypeName, NamedResolver (Resolver o e m)))
-> [(TypeName, NamedResolverFunction o e m)]
-> [(TypeName, NamedResolver (Resolver o e m))]
forall a b. (a -> b) -> [a] -> [b]
map (TypeName, NamedResolverFunction o e m)
-> (TypeName, NamedResolver (Resolver o e m))
forall (o :: OperationType) (m :: * -> *) e.
(LiftOperation o, Monad m) =>
(TypeName, ValidValue -> Resolver o e m (ResultBuilder o e m))
-> (TypeName, NamedResolver (Resolver o e m))
packRes
where
packRes :: (LiftOperation o, Monad m) => (TypeName, ValidValue -> Resolver o e m (ResultBuilder o e m)) -> (TypeName, NamedResolver (Resolver o e m))
packRes :: (TypeName, ValidValue -> Resolver o e m (ResultBuilder o e m))
-> (TypeName, NamedResolver (Resolver o e m))
packRes (TypeName
typeName, ValidValue -> Resolver o e m (ResultBuilder o e m)
value) =
( TypeName
typeName,
TypeName
-> (ValidValue
-> Resolver o e m (NamedResolverResult (Resolver o e m)))
-> NamedResolver (Resolver o e m)
forall (m :: * -> *).
TypeName
-> (ValidValue -> m (NamedResolverResult m)) -> NamedResolver m
NamedResolver
TypeName
typeName
( (ResultBuilder o e m -> NamedResolverResult (Resolver o e m))
-> Resolver o e m (ResultBuilder o e m)
-> Resolver o e m (NamedResolverResult (Resolver o e m))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ResultBuilder o e m -> NamedResolverResult (Resolver o e m)
forall (o :: OperationType) e (m :: * -> *).
ResultBuilder o e m -> NamedResolverResult (Resolver o e m)
mapValue
(Resolver o e m (ResultBuilder o e m)
-> Resolver o e m (NamedResolverResult (Resolver o e m)))
-> (ValidValue -> Resolver o e m (ResultBuilder o e m))
-> ValidValue
-> Resolver o e m (NamedResolverResult (Resolver o e m))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ValidValue -> Resolver o e m (ResultBuilder o e m)
value
)
)
where
mapValue :: ResultBuilder o e m -> NamedResolverResult (Resolver o e m)
mapValue (Object [(FieldName, Resolver o e m (ResolverValue (Resolver o e m)))]
x) = ObjectTypeResolver (Resolver o e m)
-> NamedResolverResult (Resolver o e m)
forall (m :: * -> *). ObjectTypeResolver m -> NamedResolverResult m
NamedObjectResolver (HashMap FieldName (Resolver o e m (ResolverValue (Resolver o e m)))
-> ObjectTypeResolver (Resolver o e m)
forall (m :: * -> *).
HashMap FieldName (m (ResolverValue m)) -> ObjectTypeResolver m
ObjectTypeResolver (HashMap
FieldName (Resolver o e m (ResolverValue (Resolver o e m)))
-> ObjectTypeResolver (Resolver o e m))
-> HashMap
FieldName (Resolver o e m (ResolverValue (Resolver o e m)))
-> ObjectTypeResolver (Resolver o e m)
forall a b. (a -> b) -> a -> b
$ [(FieldName, Resolver o e m (ResolverValue (Resolver o e m)))]
-> HashMap
FieldName (Resolver o e m (ResolverValue (Resolver o e m)))
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HM.fromList [(FieldName, Resolver o e m (ResolverValue (Resolver o e m)))]
x)
mapValue (Union TypeName
name ValidValue
x) = NamedResolverRef -> NamedResolverResult (Resolver o e m)
forall (m :: * -> *). NamedResolverRef -> NamedResolverResult m
NamedUnionResolver (TypeName -> ValidValue -> NamedResolverRef
NamedResolverRef TypeName
name ValidValue
x)