{-# LANGUAGE DataKinds #-}
module Data.Morpheus.Types
  ( Event(..)
  
  , GQLType(KIND, description)
  , GQLScalar(parseValue, serialize)
  
  , GQLRequest(..)
  , GQLResponse(..)
  , ID(..)
  , ScalarValue(..)
  , GQLRootResolver(..)
  , constRes
  , constMutRes
  , Undefined(..)
  , Res
  , MutRes
  , SubRes
  , IORes
  , IOMutRes
  , IOSubRes
  , Resolver(..)
  , QUERY
  , MUTATION
  , SUBSCRIPTION
  , liftEitherM
  , liftM
  ) where
import           Data.Morpheus.Types.GQLScalar         (GQLScalar (parseValue, serialize))
import           Data.Morpheus.Types.GQLType           (GQLType (KIND, description))
import           Data.Morpheus.Types.ID                (ID (..))
import           Data.Morpheus.Types.Internal.Data     (MUTATION, QUERY, SUBSCRIPTION)
import           Data.Morpheus.Types.Internal.Resolver (Event (..), GQLRootResolver (..), PureOperation, Resolver (..),
                                                        liftEitherM, liftM)
import           Data.Morpheus.Types.Internal.Value    (ScalarValue (..))
import           Data.Morpheus.Types.IO                (GQLRequest (..), GQLResponse (..))
import           Data.Morpheus.Types.Types             (Undefined (..))
type Res = Resolver QUERY
type MutRes = Resolver MUTATION
type SubRes = Resolver SUBSCRIPTION
type IORes = Res IO
type IOMutRes = MutRes IO
type IOSubRes = SubRes IO
constRes :: (PureOperation o ,Monad m) => b -> a -> Resolver o m e b
constRes = const . pure
constMutRes :: Monad m =>  [e] -> a -> args -> MutRes m e a
constMutRes list value = const $ MutResolver list $ pure value