module Data.Morpheus.App.Internal.Resolving.NamedResolver
  ( runResolverMap,
  )
where

import Data.Morpheus.App.Internal.Resolving.Event (EventHandler (Channel))
import Data.Morpheus.App.Internal.Resolving.ResolveValue
  ( resolveRef,
  )
import Data.Morpheus.App.Internal.Resolving.Resolver (LiftOperation, Resolver, ResponseStream, runResolver)
import Data.Morpheus.App.Internal.Resolving.ResolverState
  ( ResolverContext (..),
    ResolverState,
  )
import Data.Morpheus.App.Internal.Resolving.Types
  ( NamedResolverRef (..),
    ResolverMap,
  )
import Data.Morpheus.Types.Internal.AST
  ( Selection (..),
    SelectionContent (..),
    SelectionSet,
    TypeName,
    VALID,
    ValidValue,
    Value (..),
  )

runResolverMap ::
  (Monad m, LiftOperation o) =>
  Maybe (Selection VALID -> ResolverState (Channel e)) ->
  TypeName ->
  ResolverMap (Resolver o e m) ->
  ResolverContext ->
  SelectionSet VALID ->
  ResponseStream e m ValidValue
runResolverMap :: forall (m :: * -> *) (o :: OperationType) e.
(Monad m, LiftOperation o) =>
Maybe (Selection VALID -> ResolverState (Channel e))
-> TypeName
-> ResolverMap (Resolver o e m)
-> ResolverContext
-> SelectionSet VALID
-> ResponseStream e m ValidValue
runResolverMap
  Maybe (Selection VALID -> ResolverState (Channel e))
channels
  TypeName
name
  ResolverMap (Resolver o e m)
res
  ResolverContext
ctx
  SelectionSet VALID
selection = forall (m :: * -> *) event (o :: OperationType).
Monad m =>
Maybe (Selection VALID -> ResolverState (Channel event))
-> Resolver o event m ValidValue
-> ResolverContext
-> ResponseStream event m ValidValue
runResolver Maybe (Selection VALID -> ResolverState (Channel e))
channels Resolver o e m ValidValue
resolvedValue ResolverContext
ctx
    where
      resolvedValue :: Resolver o e m ValidValue
resolvedValue = forall (m :: * -> *).
(MonadError GQLError m, MonadReader ResolverContext m) =>
ResolverMap m
-> NamedResolverRef -> SelectionContent VALID -> m ValidValue
resolveRef ResolverMap (Resolver o e m)
res (TypeName -> ValidValue -> NamedResolverRef
NamedResolverRef TypeName
name forall (stage :: Stage). Value stage
Null) (forall (s :: Stage). SelectionSet s -> SelectionContent s
SelectionSet SelectionSet VALID
selection)