{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE NoImplicitPrelude #-} module Data.Morpheus.Server.Resolvers ( ResolveNamed (..), NamedResolverT (..), resolve, NamedResolvers (..), RootResolver (..), defaultRootResolver, ResolverO, ComposedResolver, constRes, ResolverQ, ResolverM, ResolverS, useBatched, ignoreBatching, Flexible, Composed, ) where import Data.Morpheus.App.Internal.Resolving ( MonadResolver (..), Resolver, ) import Data.Morpheus.Server.Types.NamedResolvers ( NamedResolverT (..), ResolveNamed (..), ignoreBatching, resolve, useBatched, ) import Data.Morpheus.Server.Types.Types ( Undefined (..), ) import Data.Morpheus.Types.Internal.AST import Relude hiding (Undefined) data NamedResolvers (m :: Type -> Type) event (qu :: (Type -> Type) -> Type) (mu :: (Type -> Type) -> Type) (su :: (Type -> Type) -> Type) = ( ResolveNamed (Resolver QUERY event m) (qu (NamedResolverT (Resolver QUERY event m))) ) => NamedResolvers -- | GraphQL Root resolver, also the interpreter generates a GQL schema from it. -- 'queryResolver' is required, 'mutationResolver' and 'subscriptionResolver' are optional, -- if your schema does not supports __mutation__ or __subscription__ , you can use __()__ for it. data RootResolver (m :: Type -> Type) event (query :: (Type -> Type) -> Type) (mutation :: (Type -> Type) -> Type) (subscription :: (Type -> Type) -> Type) = RootResolver { queryResolver :: query (Resolver QUERY event m), mutationResolver :: mutation (Resolver MUTATION event m), subscriptionResolver :: subscription (Resolver SUBSCRIPTION event m) } defaultRootResolver :: RootResolver m event Undefined Undefined Undefined defaultRootResolver = RootResolver { queryResolver = Undefined False, mutationResolver = Undefined False, subscriptionResolver = Undefined False } class FlexibleResolver (f :: Type -> Type) (a :: k) where type Flexible (m :: Type -> Type) a :: Type type Composed (m :: Type -> Type) f a :: Type instance FlexibleResolver f (a :: Type) where type Flexible m a = m a type Composed m f a = m (f a) instance FlexibleResolver f (a :: (Type -> Type) -> Type) where type Flexible m a = m (a m) type Composed m f a = m (f (a m)) type ComposedResolver o e m f a = Composed (Resolver o e m) f a type ResolverO o e m a = Flexible (Resolver o e m) a type ResolverQ e m a = ResolverO QUERY e m a type ResolverM e m a = ResolverO MUTATION e m a type ResolverS e m a = ResolverO SUBSCRIPTION e m a constRes :: (MonadResolver m) => b -> a -> m b constRes = const . pure