{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

module Data.Morpheus.Server.Deriving.Utils.Use
  ( UseDeriving (..),
    GQLTypeCTX (..),
    UseGQLValue (..),
    UseResolver (..),
    UseNamedResolver (..),
    UseRef (..),
    UseGQLType (..),
    GQLValueCTX (..),
    useDecodeArguments,
  )
where

import Data.Morpheus.App.Internal.Resolving (NamedResolver (..), ResolverState, ResolverValue)
import Data.Morpheus.Generic (ScanRef)
import Data.Morpheus.Internal.Ext (GQLResult)
import Data.Morpheus.Server.Deriving.Utils.GScan (FreeCatType)
import Data.Morpheus.Server.Deriving.Utils.Types
import Data.Morpheus.Server.Types.Directives
  ( GDirectiveUsages (..),
  )
import Data.Morpheus.Server.Types.Internal
import Data.Morpheus.Server.Types.TypeName
  ( TypeFingerprint,
  )
import Data.Morpheus.Types.Internal.AST
  ( Arguments,
    ArgumentsDefinition,
    CONST,
    TypeName,
    TypeWrapper,
    VALID,
    ValidValue,
    Value,
  )
import Relude

data UseRef (c :: Type -> Constraint) where
  UseRef :: (c a) => CatType t a -> UseRef c

class UseGQLType ctx con | ctx -> con where
  useFingerprint :: (con a) => ctx -> CatType c a -> TypeFingerprint
  useTypename :: (con a) => ctx -> CatType c a -> TypeName
  useWrappers :: (con a) => ctx -> CatType c a -> TypeWrapper
  useDeriveNode :: (con a) => ctx -> CatType c a -> GQLResult (GQLTypeNode c)
  useDeriveFieldArgs :: (con a) => ctx -> CatType c a -> GQLResult (ArgumentsDefinition CONST)
  useExploreRef :: (con a) => ctx -> CatType c a -> [ScanRef FreeCatType con]

data GQLTypeCTX gql = GQLTypeCTX
  { forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a.
   gql a =>
   CatType c a -> TypeFingerprint
__useFingerprint :: forall c a. (gql a) => CatType c a -> TypeFingerprint,
    forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a. gql a => CatType c a -> TypeName
__useTypename :: forall c a. (gql a) => CatType c a -> TypeName,
    forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a. gql a => CatType c a -> TypeData
__useTypeData :: forall c a. (gql a) => CatType c a -> TypeData,
    forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a.
   gql a =>
   CatType c a -> GQLResult (GQLTypeNode c)
__useDeriveNode :: forall c a. (gql a) => CatType c a -> GQLResult (GQLTypeNode c),
    forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a.
   gql a =>
   CatType c a -> GQLResult (ArgumentsDefinition CONST)
__useDeriveFieldArgs :: forall c a. (gql a) => CatType c a -> GQLResult (ArgumentsDefinition CONST),
    forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a.
   gql a =>
   CatType c a -> [ScanRef FreeCatType gql]
__useExploreRef :: forall c a. (gql a) => CatType c a -> [ScanRef FreeCatType gql]
  }

instance UseGQLType (GQLTypeCTX gql) gql where
  useFingerprint :: forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql -> CatType c a -> TypeFingerprint
useFingerprint GQLTypeCTX {forall (c :: TypeCategory) a.
gql a =>
CatType c a -> TypeFingerprint
__useFingerprint :: forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a.
   gql a =>
   CatType c a -> TypeFingerprint
__useFingerprint :: forall (c :: TypeCategory) a.
gql a =>
CatType c a -> TypeFingerprint
__useFingerprint} = CatType c a -> TypeFingerprint
forall (c :: TypeCategory) a.
gql a =>
CatType c a -> TypeFingerprint
__useFingerprint
  useTypename :: forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql -> CatType c a -> TypeName
useTypename GQLTypeCTX {forall (c :: TypeCategory) a. gql a => CatType c a -> TypeName
__useTypename :: forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a. gql a => CatType c a -> TypeName
__useTypename :: forall (c :: TypeCategory) a. gql a => CatType c a -> TypeName
__useTypename} = CatType c a -> TypeName
forall (c :: TypeCategory) a. gql a => CatType c a -> TypeName
__useTypename
  useWrappers :: forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql -> CatType c a -> TypeWrapper
useWrappers GQLTypeCTX {forall (c :: TypeCategory) a. gql a => CatType c a -> TypeData
__useTypeData :: forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a. gql a => CatType c a -> TypeData
__useTypeData :: forall (c :: TypeCategory) a. gql a => CatType c a -> TypeData
__useTypeData} = TypeData -> TypeWrapper
gqlWrappers (TypeData -> TypeWrapper)
-> (CatType c a -> TypeData) -> CatType c a -> TypeWrapper
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CatType c a -> TypeData
forall (c :: TypeCategory) a. gql a => CatType c a -> TypeData
__useTypeData
  useDeriveNode :: forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql -> CatType c a -> GQLResult (GQLTypeNode c)
useDeriveNode GQLTypeCTX {forall (c :: TypeCategory) a.
gql a =>
CatType c a -> GQLResult (GQLTypeNode c)
__useDeriveNode :: forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a.
   gql a =>
   CatType c a -> GQLResult (GQLTypeNode c)
__useDeriveNode :: forall (c :: TypeCategory) a.
gql a =>
CatType c a -> GQLResult (GQLTypeNode c)
__useDeriveNode} = CatType c a -> GQLResult (GQLTypeNode c)
forall (c :: TypeCategory) a.
gql a =>
CatType c a -> GQLResult (GQLTypeNode c)
__useDeriveNode
  useDeriveFieldArgs :: forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql
-> CatType c a -> GQLResult (ArgumentsDefinition CONST)
useDeriveFieldArgs GQLTypeCTX {forall (c :: TypeCategory) a.
gql a =>
CatType c a -> GQLResult (ArgumentsDefinition CONST)
__useDeriveFieldArgs :: forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a.
   gql a =>
   CatType c a -> GQLResult (ArgumentsDefinition CONST)
__useDeriveFieldArgs :: forall (c :: TypeCategory) a.
gql a =>
CatType c a -> GQLResult (ArgumentsDefinition CONST)
__useDeriveFieldArgs} = CatType c a -> GQLResult (ArgumentsDefinition CONST)
forall (c :: TypeCategory) a.
gql a =>
CatType c a -> GQLResult (ArgumentsDefinition CONST)
__useDeriveFieldArgs
  useExploreRef :: forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql -> CatType c a -> [ScanRef FreeCatType gql]
useExploreRef GQLTypeCTX {forall (c :: TypeCategory) a.
gql a =>
CatType c a -> [ScanRef FreeCatType gql]
__useExploreRef :: forall (gql :: * -> Constraint).
GQLTypeCTX gql
-> forall (c :: TypeCategory) a.
   gql a =>
   CatType c a -> [ScanRef FreeCatType gql]
__useExploreRef :: forall (c :: TypeCategory) a.
gql a =>
CatType c a -> [ScanRef FreeCatType gql]
__useExploreRef} = CatType c a -> [ScanRef FreeCatType gql]
forall (c :: TypeCategory) a.
gql a =>
CatType c a -> [ScanRef FreeCatType gql]
__useExploreRef

data GQLValueCTX val = GQLValueCTX
  { forall (val :: * -> Constraint).
GQLValueCTX val -> forall a. val a => a -> GQLResult (Value CONST)
__useEncodeValue :: forall a. (val a) => a -> GQLResult (Value CONST),
    forall (val :: * -> Constraint).
GQLValueCTX val -> forall a. val a => ValidValue -> ResolverState a
__useDecodeValue :: forall a. (val a) => ValidValue -> ResolverState a
  }

class UseGQLValue ctx con | ctx -> con where
  useEncodeValue :: (con a) => ctx -> a -> GQLResult (Value CONST)
  useDecodeValue :: (con a) => ctx -> ValidValue -> ResolverState a

instance UseGQLValue (GQLValueCTX val) val where
  useEncodeValue :: forall a. val a => GQLValueCTX val -> a -> GQLResult (Value CONST)
useEncodeValue GQLValueCTX {forall a. val a => a -> GQLResult (Value CONST)
__useEncodeValue :: forall (val :: * -> Constraint).
GQLValueCTX val -> forall a. val a => a -> GQLResult (Value CONST)
__useEncodeValue :: forall a. val a => a -> GQLResult (Value CONST)
__useEncodeValue} = a -> GQLResult (Value CONST)
forall a. val a => a -> GQLResult (Value CONST)
__useEncodeValue
  useDecodeValue :: forall a. val a => GQLValueCTX val -> ValidValue -> ResolverState a
useDecodeValue GQLValueCTX {forall a. val a => ValidValue -> ResolverState a
__useDecodeValue :: forall (val :: * -> Constraint).
GQLValueCTX val -> forall a. val a => ValidValue -> ResolverState a
__useDecodeValue :: forall a. val a => ValidValue -> ResolverState a
__useDecodeValue} = ValidValue -> ResolverState a
forall a. val a => ValidValue -> ResolverState a
__useDecodeValue

data UseDeriving gql val = UseDeriving
  { forall (gql :: * -> Constraint) (val :: * -> Constraint).
UseDeriving gql val
-> forall (f :: * -> *) a. gql a => f a -> GDirectiveUsages gql val
useDirectives :: forall f a. (gql a) => f a -> GDirectiveUsages gql val,
    forall (gql :: * -> Constraint) (val :: * -> Constraint).
UseDeriving gql val -> GQLValueCTX val
__useValue :: GQLValueCTX val,
    forall (gql :: * -> Constraint) (val :: * -> Constraint).
UseDeriving gql val -> GQLTypeCTX gql
__useGQL :: GQLTypeCTX gql
  }

instance UseGQLType (UseDeriving gql val) gql where
  useFingerprint :: forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> TypeFingerprint
useFingerprint = GQLTypeCTX gql -> CatType c a -> TypeFingerprint
forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql -> CatType c a -> TypeFingerprint
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> TypeFingerprint
useFingerprint (GQLTypeCTX gql -> CatType c a -> TypeFingerprint)
-> (UseDeriving gql val -> GQLTypeCTX gql)
-> UseDeriving gql val
-> CatType c a
-> TypeFingerprint
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseDeriving gql val -> GQLTypeCTX gql
forall (gql :: * -> Constraint) (val :: * -> Constraint).
UseDeriving gql val -> GQLTypeCTX gql
__useGQL
  useTypename :: forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> TypeName
useTypename = GQLTypeCTX gql -> CatType c a -> TypeName
forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql -> CatType c a -> TypeName
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> TypeName
useTypename (GQLTypeCTX gql -> CatType c a -> TypeName)
-> (UseDeriving gql val -> GQLTypeCTX gql)
-> UseDeriving gql val
-> CatType c a
-> TypeName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseDeriving gql val -> GQLTypeCTX gql
forall (gql :: * -> Constraint) (val :: * -> Constraint).
UseDeriving gql val -> GQLTypeCTX gql
__useGQL
  useWrappers :: forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> TypeWrapper
useWrappers = GQLTypeCTX gql -> CatType c a -> TypeWrapper
forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql -> CatType c a -> TypeWrapper
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> TypeWrapper
useWrappers (GQLTypeCTX gql -> CatType c a -> TypeWrapper)
-> (UseDeriving gql val -> GQLTypeCTX gql)
-> UseDeriving gql val
-> CatType c a
-> TypeWrapper
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseDeriving gql val -> GQLTypeCTX gql
forall (gql :: * -> Constraint) (val :: * -> Constraint).
UseDeriving gql val -> GQLTypeCTX gql
__useGQL
  useDeriveNode :: forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> GQLResult (GQLTypeNode c)
useDeriveNode = GQLTypeCTX gql -> CatType c a -> GQLResult (GQLTypeNode c)
forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql -> CatType c a -> GQLResult (GQLTypeNode c)
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> GQLResult (GQLTypeNode c)
useDeriveNode (GQLTypeCTX gql -> CatType c a -> GQLResult (GQLTypeNode c))
-> (UseDeriving gql val -> GQLTypeCTX gql)
-> UseDeriving gql val
-> CatType c a
-> GQLResult (GQLTypeNode c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseDeriving gql val -> GQLTypeCTX gql
forall (gql :: * -> Constraint) (val :: * -> Constraint).
UseDeriving gql val -> GQLTypeCTX gql
__useGQL
  useDeriveFieldArgs :: forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val
-> CatType c a -> GQLResult (ArgumentsDefinition CONST)
useDeriveFieldArgs = GQLTypeCTX gql
-> CatType c a -> GQLResult (ArgumentsDefinition CONST)
forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql
-> CatType c a -> GQLResult (ArgumentsDefinition CONST)
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> GQLResult (ArgumentsDefinition CONST)
useDeriveFieldArgs (GQLTypeCTX gql
 -> CatType c a -> GQLResult (ArgumentsDefinition CONST))
-> (UseDeriving gql val -> GQLTypeCTX gql)
-> UseDeriving gql val
-> CatType c a
-> GQLResult (ArgumentsDefinition CONST)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseDeriving gql val -> GQLTypeCTX gql
forall (gql :: * -> Constraint) (val :: * -> Constraint).
UseDeriving gql val -> GQLTypeCTX gql
__useGQL
  useExploreRef :: forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> [ScanRef FreeCatType gql]
useExploreRef = GQLTypeCTX gql -> CatType c a -> [ScanRef FreeCatType gql]
forall a (c :: TypeCategory).
gql a =>
GQLTypeCTX gql -> CatType c a -> [ScanRef FreeCatType gql]
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> [ScanRef FreeCatType con]
useExploreRef (GQLTypeCTX gql -> CatType c a -> [ScanRef FreeCatType gql])
-> (UseDeriving gql val -> GQLTypeCTX gql)
-> UseDeriving gql val
-> CatType c a
-> [ScanRef FreeCatType gql]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseDeriving gql val -> GQLTypeCTX gql
forall (gql :: * -> Constraint) (val :: * -> Constraint).
UseDeriving gql val -> GQLTypeCTX gql
__useGQL

instance UseGQLValue (UseDeriving gql val) val where
  useEncodeValue :: forall a.
val a =>
UseDeriving gql val -> a -> GQLResult (Value CONST)
useEncodeValue = GQLValueCTX val -> a -> GQLResult (Value CONST)
forall a. val a => GQLValueCTX val -> a -> GQLResult (Value CONST)
forall ctx (con :: * -> Constraint) a.
(UseGQLValue ctx con, con a) =>
ctx -> a -> GQLResult (Value CONST)
useEncodeValue (GQLValueCTX val -> a -> GQLResult (Value CONST))
-> (UseDeriving gql val -> GQLValueCTX val)
-> UseDeriving gql val
-> a
-> GQLResult (Value CONST)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseDeriving gql val -> GQLValueCTX val
forall (gql :: * -> Constraint) (val :: * -> Constraint).
UseDeriving gql val -> GQLValueCTX val
__useValue
  useDecodeValue :: forall a.
val a =>
UseDeriving gql val -> ValidValue -> ResolverState a
useDecodeValue = GQLValueCTX val -> ValidValue -> ResolverState a
forall a. val a => GQLValueCTX val -> ValidValue -> ResolverState a
forall ctx (con :: * -> Constraint) a.
(UseGQLValue ctx con, con a) =>
ctx -> ValidValue -> ResolverState a
useDecodeValue (GQLValueCTX val -> ValidValue -> ResolverState a)
-> (UseDeriving gql val -> GQLValueCTX val)
-> UseDeriving gql val
-> ValidValue
-> ResolverState a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseDeriving gql val -> GQLValueCTX val
forall (gql :: * -> Constraint) (val :: * -> Constraint).
UseDeriving gql val -> GQLValueCTX val
__useValue

data UseResolver res gql val = UseResolver
  { forall (res :: (* -> *) -> * -> Constraint)
       (gql :: * -> Constraint) (val :: * -> Constraint).
UseResolver res gql val
-> forall a (m :: * -> *). res m a => a -> m (ResolverValue m)
useEncodeResolver :: forall a m. (res m a) => a -> m (ResolverValue m),
    forall (res :: (* -> *) -> * -> Constraint)
       (gql :: * -> Constraint) (val :: * -> Constraint).
UseResolver res gql val -> UseDeriving gql val
resDrv :: UseDeriving gql val
  }

instance UseGQLType (UseResolver res gql val) gql where
  useFingerprint :: forall a (c :: TypeCategory).
gql a =>
UseResolver res gql val -> CatType c a -> TypeFingerprint
useFingerprint = UseDeriving gql val -> CatType c a -> TypeFingerprint
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> TypeFingerprint
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> TypeFingerprint
useFingerprint (UseDeriving gql val -> CatType c a -> TypeFingerprint)
-> (UseResolver res gql val -> UseDeriving gql val)
-> UseResolver res gql val
-> CatType c a
-> TypeFingerprint
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseResolver res gql val -> UseDeriving gql val
forall (res :: (* -> *) -> * -> Constraint)
       (gql :: * -> Constraint) (val :: * -> Constraint).
UseResolver res gql val -> UseDeriving gql val
resDrv
  useTypename :: forall a (c :: TypeCategory).
gql a =>
UseResolver res gql val -> CatType c a -> TypeName
useTypename = UseDeriving gql val -> CatType c a -> TypeName
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> TypeName
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> TypeName
useTypename (UseDeriving gql val -> CatType c a -> TypeName)
-> (UseResolver res gql val -> UseDeriving gql val)
-> UseResolver res gql val
-> CatType c a
-> TypeName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseResolver res gql val -> UseDeriving gql val
forall (res :: (* -> *) -> * -> Constraint)
       (gql :: * -> Constraint) (val :: * -> Constraint).
UseResolver res gql val -> UseDeriving gql val
resDrv
  useWrappers :: forall a (c :: TypeCategory).
gql a =>
UseResolver res gql val -> CatType c a -> TypeWrapper
useWrappers = UseDeriving gql val -> CatType c a -> TypeWrapper
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> TypeWrapper
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> TypeWrapper
useWrappers (UseDeriving gql val -> CatType c a -> TypeWrapper)
-> (UseResolver res gql val -> UseDeriving gql val)
-> UseResolver res gql val
-> CatType c a
-> TypeWrapper
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseResolver res gql val -> UseDeriving gql val
forall (res :: (* -> *) -> * -> Constraint)
       (gql :: * -> Constraint) (val :: * -> Constraint).
UseResolver res gql val -> UseDeriving gql val
resDrv
  useDeriveNode :: forall a (c :: TypeCategory).
gql a =>
UseResolver res gql val -> CatType c a -> GQLResult (GQLTypeNode c)
useDeriveNode = UseDeriving gql val -> CatType c a -> GQLResult (GQLTypeNode c)
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> GQLResult (GQLTypeNode c)
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> GQLResult (GQLTypeNode c)
useDeriveNode (UseDeriving gql val -> CatType c a -> GQLResult (GQLTypeNode c))
-> (UseResolver res gql val -> UseDeriving gql val)
-> UseResolver res gql val
-> CatType c a
-> GQLResult (GQLTypeNode c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseResolver res gql val -> UseDeriving gql val
forall (res :: (* -> *) -> * -> Constraint)
       (gql :: * -> Constraint) (val :: * -> Constraint).
UseResolver res gql val -> UseDeriving gql val
resDrv
  useDeriveFieldArgs :: forall a (c :: TypeCategory).
gql a =>
UseResolver res gql val
-> CatType c a -> GQLResult (ArgumentsDefinition CONST)
useDeriveFieldArgs = UseDeriving gql val
-> CatType c a -> GQLResult (ArgumentsDefinition CONST)
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val
-> CatType c a -> GQLResult (ArgumentsDefinition CONST)
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> GQLResult (ArgumentsDefinition CONST)
useDeriveFieldArgs (UseDeriving gql val
 -> CatType c a -> GQLResult (ArgumentsDefinition CONST))
-> (UseResolver res gql val -> UseDeriving gql val)
-> UseResolver res gql val
-> CatType c a
-> GQLResult (ArgumentsDefinition CONST)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseResolver res gql val -> UseDeriving gql val
forall (res :: (* -> *) -> * -> Constraint)
       (gql :: * -> Constraint) (val :: * -> Constraint).
UseResolver res gql val -> UseDeriving gql val
resDrv
  useExploreRef :: forall a (c :: TypeCategory).
gql a =>
UseResolver res gql val -> CatType c a -> [ScanRef FreeCatType gql]
useExploreRef = UseDeriving gql val -> CatType c a -> [ScanRef FreeCatType gql]
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> [ScanRef FreeCatType gql]
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> [ScanRef FreeCatType con]
useExploreRef (UseDeriving gql val -> CatType c a -> [ScanRef FreeCatType gql])
-> (UseResolver res gql val -> UseDeriving gql val)
-> UseResolver res gql val
-> CatType c a
-> [ScanRef FreeCatType gql]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseResolver res gql val -> UseDeriving gql val
forall (res :: (* -> *) -> * -> Constraint)
       (gql :: * -> Constraint) (val :: * -> Constraint).
UseResolver res gql val -> UseDeriving gql val
resDrv

instance UseGQLValue (UseResolver res gql val) val where
  useEncodeValue :: forall a.
val a =>
UseResolver res gql val -> a -> GQLResult (Value CONST)
useEncodeValue = UseDeriving gql val -> a -> GQLResult (Value CONST)
forall a.
val a =>
UseDeriving gql val -> a -> GQLResult (Value CONST)
forall ctx (con :: * -> Constraint) a.
(UseGQLValue ctx con, con a) =>
ctx -> a -> GQLResult (Value CONST)
useEncodeValue (UseDeriving gql val -> a -> GQLResult (Value CONST))
-> (UseResolver res gql val -> UseDeriving gql val)
-> UseResolver res gql val
-> a
-> GQLResult (Value CONST)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseResolver res gql val -> UseDeriving gql val
forall (res :: (* -> *) -> * -> Constraint)
       (gql :: * -> Constraint) (val :: * -> Constraint).
UseResolver res gql val -> UseDeriving gql val
resDrv
  useDecodeValue :: forall a.
val a =>
UseResolver res gql val -> ValidValue -> ResolverState a
useDecodeValue = UseDeriving gql val -> ValidValue -> ResolverState a
forall a.
val a =>
UseDeriving gql val -> ValidValue -> ResolverState a
forall ctx (con :: * -> Constraint) a.
(UseGQLValue ctx con, con a) =>
ctx -> ValidValue -> ResolverState a
useDecodeValue (UseDeriving gql val -> ValidValue -> ResolverState a)
-> (UseResolver res gql val -> UseDeriving gql val)
-> UseResolver res gql val
-> ValidValue
-> ResolverState a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseResolver res gql val -> UseDeriving gql val
forall (res :: (* -> *) -> * -> Constraint)
       (gql :: * -> Constraint) (val :: * -> Constraint).
UseResolver res gql val -> UseDeriving gql val
resDrv

data UseNamedResolver named fun gql val = UseNamedResolver
  { forall (named :: (* -> *) -> * -> Constraint)
       (fun :: (* -> *) -> * -> Constraint) (gql :: * -> Constraint)
       (val :: * -> Constraint).
UseNamedResolver named fun gql val
-> forall a (m :: * -> *). fun m a => a -> m (ResolverValue m)
useNamedFieldResolver :: forall a m. (fun m a) => a -> m (ResolverValue m),
    forall (named :: (* -> *) -> * -> Constraint)
       (fun :: (* -> *) -> * -> Constraint) (gql :: * -> Constraint)
       (val :: * -> Constraint).
UseNamedResolver named fun gql val
-> forall (f :: * -> *) a (m :: * -> *).
   named m a =>
   f a -> [NamedResolver m]
useDeriveNamedResolvers :: forall f a m. (named m a) => f a -> [NamedResolver m],
    forall (named :: (* -> *) -> * -> Constraint)
       (fun :: (* -> *) -> * -> Constraint) (gql :: * -> Constraint)
       (val :: * -> Constraint).
UseNamedResolver named fun gql val
-> forall (f :: * -> *) a (m :: * -> *).
   named m a =>
   f a -> [ScanRef Proxy (named m)]
useDeriveNamedRefs :: forall f a m. (named m a) => f a -> [ScanRef Proxy (named m)],
    forall (named :: (* -> *) -> * -> Constraint)
       (fun :: (* -> *) -> * -> Constraint) (gql :: * -> Constraint)
       (val :: * -> Constraint).
UseNamedResolver named fun gql val -> UseDeriving gql val
namedDrv :: UseDeriving gql val
  }

instance UseGQLType (UseNamedResolver named res gql val) gql where
  useFingerprint :: forall a (c :: TypeCategory).
gql a =>
UseNamedResolver named res gql val
-> CatType c a -> TypeFingerprint
useFingerprint = UseDeriving gql val -> CatType c a -> TypeFingerprint
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> TypeFingerprint
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> TypeFingerprint
useFingerprint (UseDeriving gql val -> CatType c a -> TypeFingerprint)
-> (UseNamedResolver named res gql val -> UseDeriving gql val)
-> UseNamedResolver named res gql val
-> CatType c a
-> TypeFingerprint
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseNamedResolver named res gql val -> UseDeriving gql val
forall (named :: (* -> *) -> * -> Constraint)
       (fun :: (* -> *) -> * -> Constraint) (gql :: * -> Constraint)
       (val :: * -> Constraint).
UseNamedResolver named fun gql val -> UseDeriving gql val
namedDrv
  useTypename :: forall a (c :: TypeCategory).
gql a =>
UseNamedResolver named res gql val -> CatType c a -> TypeName
useTypename = UseDeriving gql val -> CatType c a -> TypeName
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> TypeName
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> TypeName
useTypename (UseDeriving gql val -> CatType c a -> TypeName)
-> (UseNamedResolver named res gql val -> UseDeriving gql val)
-> UseNamedResolver named res gql val
-> CatType c a
-> TypeName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseNamedResolver named res gql val -> UseDeriving gql val
forall (named :: (* -> *) -> * -> Constraint)
       (fun :: (* -> *) -> * -> Constraint) (gql :: * -> Constraint)
       (val :: * -> Constraint).
UseNamedResolver named fun gql val -> UseDeriving gql val
namedDrv
  useWrappers :: forall a (c :: TypeCategory).
gql a =>
UseNamedResolver named res gql val -> CatType c a -> TypeWrapper
useWrappers = UseDeriving gql val -> CatType c a -> TypeWrapper
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> TypeWrapper
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> TypeWrapper
useWrappers (UseDeriving gql val -> CatType c a -> TypeWrapper)
-> (UseNamedResolver named res gql val -> UseDeriving gql val)
-> UseNamedResolver named res gql val
-> CatType c a
-> TypeWrapper
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseNamedResolver named res gql val -> UseDeriving gql val
forall (named :: (* -> *) -> * -> Constraint)
       (fun :: (* -> *) -> * -> Constraint) (gql :: * -> Constraint)
       (val :: * -> Constraint).
UseNamedResolver named fun gql val -> UseDeriving gql val
namedDrv
  useDeriveNode :: forall a (c :: TypeCategory).
gql a =>
UseNamedResolver named res gql val
-> CatType c a -> GQLResult (GQLTypeNode c)
useDeriveNode = UseDeriving gql val -> CatType c a -> GQLResult (GQLTypeNode c)
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> GQLResult (GQLTypeNode c)
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> GQLResult (GQLTypeNode c)
useDeriveNode (UseDeriving gql val -> CatType c a -> GQLResult (GQLTypeNode c))
-> (UseNamedResolver named res gql val -> UseDeriving gql val)
-> UseNamedResolver named res gql val
-> CatType c a
-> GQLResult (GQLTypeNode c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseNamedResolver named res gql val -> UseDeriving gql val
forall (named :: (* -> *) -> * -> Constraint)
       (fun :: (* -> *) -> * -> Constraint) (gql :: * -> Constraint)
       (val :: * -> Constraint).
UseNamedResolver named fun gql val -> UseDeriving gql val
namedDrv
  useDeriveFieldArgs :: forall a (c :: TypeCategory).
gql a =>
UseNamedResolver named res gql val
-> CatType c a -> GQLResult (ArgumentsDefinition CONST)
useDeriveFieldArgs = UseDeriving gql val
-> CatType c a -> GQLResult (ArgumentsDefinition CONST)
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val
-> CatType c a -> GQLResult (ArgumentsDefinition CONST)
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> GQLResult (ArgumentsDefinition CONST)
useDeriveFieldArgs (UseDeriving gql val
 -> CatType c a -> GQLResult (ArgumentsDefinition CONST))
-> (UseNamedResolver named res gql val -> UseDeriving gql val)
-> UseNamedResolver named res gql val
-> CatType c a
-> GQLResult (ArgumentsDefinition CONST)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseNamedResolver named res gql val -> UseDeriving gql val
forall (named :: (* -> *) -> * -> Constraint)
       (fun :: (* -> *) -> * -> Constraint) (gql :: * -> Constraint)
       (val :: * -> Constraint).
UseNamedResolver named fun gql val -> UseDeriving gql val
namedDrv
  useExploreRef :: forall a (c :: TypeCategory).
gql a =>
UseNamedResolver named res gql val
-> CatType c a -> [ScanRef FreeCatType gql]
useExploreRef = UseDeriving gql val -> CatType c a -> [ScanRef FreeCatType gql]
forall a (c :: TypeCategory).
gql a =>
UseDeriving gql val -> CatType c a -> [ScanRef FreeCatType gql]
forall ctx (con :: * -> Constraint) a (c :: TypeCategory).
(UseGQLType ctx con, con a) =>
ctx -> CatType c a -> [ScanRef FreeCatType con]
useExploreRef (UseDeriving gql val -> CatType c a -> [ScanRef FreeCatType gql])
-> (UseNamedResolver named res gql val -> UseDeriving gql val)
-> UseNamedResolver named res gql val
-> CatType c a
-> [ScanRef FreeCatType gql]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UseNamedResolver named res gql val -> UseDeriving gql val
forall (named :: (* -> *) -> * -> Constraint)
       (fun :: (* -> *) -> * -> Constraint) (gql :: * -> Constraint)
       (val :: * -> Constraint).
UseNamedResolver named fun gql val -> UseDeriving gql val
namedDrv

useDecodeArguments :: (val a) => UseDeriving gql val -> Arguments VALID -> ResolverState a
useDecodeArguments :: forall (val :: * -> Constraint) a (gql :: * -> Constraint).
val a =>
UseDeriving gql val -> Arguments VALID -> ResolverState a
useDecodeArguments UseDeriving gql val
ctx = UseDeriving gql val -> ValidValue -> ResolverState a
forall a.
val a =>
UseDeriving gql val -> ValidValue -> ResolverState a
forall ctx (con :: * -> Constraint) a.
(UseGQLValue ctx con, con a) =>
ctx -> ValidValue -> ResolverState a
useDecodeValue UseDeriving gql val
ctx (ValidValue -> ResolverState a)
-> (Arguments VALID -> ValidValue)
-> Arguments VALID
-> ResolverState a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Arguments VALID -> ValidValue
argumentsToObject