{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}

-- | Build GraphQL APIs with your favorite functional language!
module Data.Morpheus
  ( interpreter,
    debugInterpreter,
    App,
    deriveApp,
    runApp,
    withDebugger,
  )
where

-- MORPHEUS
import Data.Morpheus.App
  ( App,
    MapAPI,
    runApp,
    withDebugger,
  )
import Data.Morpheus.Server.Deriving.App
  ( RootResolverConstraint,
    deriveApp,
  )
import Data.Morpheus.Types
  ( RootResolver (..),
  )
import Relude

-- | main query processor and resolver
interpreter ::
  (MapAPI a b, RootResolverConstraint m e query mut sub) =>
  RootResolver m e query mut sub ->
  a ->
  m b
interpreter :: RootResolver m e query mut sub -> a -> m b
interpreter = App e m -> a -> m b
forall a b (m :: * -> *) e.
(MapAPI a b, Monad m) =>
App e m -> a -> m b
runApp (App e m -> a -> m b)
-> (RootResolver m e query mut sub -> App e m)
-> RootResolver m e query mut sub
-> a
-> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RootResolver m e query mut sub -> App e m
forall (m :: * -> *) event (query :: (* -> *) -> *)
       (mut :: (* -> *) -> *) (sub :: (* -> *) -> *).
RootResolverConstraint m event query mut sub =>
RootResolver m event query mut sub -> App event m
deriveApp

debugInterpreter ::
  (MapAPI a b, RootResolverConstraint m e query mut sub) =>
  RootResolver m e query mut sub ->
  a ->
  m b
debugInterpreter :: RootResolver m e query mut sub -> a -> m b
debugInterpreter = App e m -> a -> m b
forall a b (m :: * -> *) e.
(MapAPI a b, Monad m) =>
App e m -> a -> m b
runApp (App e m -> a -> m b)
-> (RootResolver m e query mut sub -> App e m)
-> RootResolver m e query mut sub
-> a
-> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. App e m -> App e m
forall e (m :: * -> *). App e m -> App e m
withDebugger (App e m -> App e m)
-> (RootResolver m e query mut sub -> App e m)
-> RootResolver m e query mut sub
-> App e m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RootResolver m e query mut sub -> App e m
forall (m :: * -> *) event (query :: (* -> *) -> *)
       (mut :: (* -> *) -> *) (sub :: (* -> *) -> *).
RootResolverConstraint m event query mut sub =>
RootResolver m event query mut sub -> App event m
deriveApp