content: {-# LANGUAGE DeriveAnyClass #-}
  {-# LANGUAGE DeriveGeneric #-}
  {-# LANGUAGE NamedFieldPuns #-}
  {-# LANGUAGE TypeFamilies #-}
  
  module Feature.Input.Scalars
    ( api,
    )
  where
  
  import Data.Morpheus.Server (interpreter)
  import Data.Morpheus.Server.Types
    ( GQLRequest,
      GQLResponse,
      GQLType,
      RootResolver (..),
      Undefined,
      defaultRootResolver,
    )
  import Data.Text (Text)
  import GHC.Generics (Generic)
  
  -- types & args
  newtype Arg a = Arg
    { value :: a
    }
    deriving (Generic, Show, GQLType)
  
  -- query
  testRes :: (Applicative m) => Arg a -> m a
  testRes Arg {value} = pure value
  
  -- resolver
  data Query m = Query
    { testFloat :: Arg Double -> m Double,
      testInt :: Arg Int -> m Int,
      testString :: Arg Text -> m Text
    }
    deriving (Generic, GQLType)
  
  rootResolver :: RootResolver IO () Query Undefined Undefined
  rootResolver =
    defaultRootResolver
      { queryResolver =
          Query
            { testFloat = testRes,
              testInt = testRes,
              testString = testRes
            }
      }
  
  api :: GQLRequest -> IO GQLResponse
  api = interpreter rootResolver
  