{-# 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 :: forall a b (m :: * -> *) e (query :: (* -> *) -> *)
       (mut :: (* -> *) -> *) (sub :: (* -> *) -> *).
(MapAPI a b, RootResolverConstraint m e query mut sub) =>
RootResolver m e query mut sub -> a -> m b
interpreter = forall a b (m :: * -> *) e.
(MapAPI a b, Monad m) =>
App e m -> a -> m b
runApp forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: (* -> *)
             -> * -> ((* -> *) -> *) -> ((* -> *) -> *) -> ((* -> *) -> *) -> *)
       (m :: * -> *) event (qu :: (* -> *) -> *) (mu :: (* -> *) -> *)
       (su :: (* -> *) -> *).
DeriveApp f m event qu mu su =>
f m event qu mu su -> App event m
deriveApp

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