{-# LANGUAGE TypeFamilies  #-}
{-# LANGUAGE TypeOperators #-}

-- | associating types to GraphQL Kinds
module Data.Morpheus.Kind
  ( SCALAR
  , OBJECT
  , ENUM
  , WRAPPER
  , UNION
  , INPUT_OBJECT
  , KIND
  ) where

import           Data.Map                     (Map)
import           Data.Set                     (Set)
import           Data.Text                    (Text)

-- MORPHEUS
import           Data.Morpheus.Types.Resolver (Resolver)

-- | Type Family to associate type to GraphQL Kind
type family KIND a :: *

-- | GraphQL Scalar: Int, Float, String, Boolean or any user defined custom Scalar type
data SCALAR

-- | GraphQL Object
data OBJECT

-- | GraphQL Enum
data ENUM

-- | GraphQL input Object
data INPUT_OBJECT

-- | GraphQL Union
data UNION

-- | GraphQL Arrays , Resolvers and NonNull fields
data WRAPPER

-- default Type Instances
type instance KIND Text = SCALAR

type instance KIND Int = SCALAR

type instance KIND Float = SCALAR

type instance KIND Bool = SCALAR

type instance KIND (Maybe a) = WRAPPER

type instance KIND [a] = WRAPPER

type instance KIND (a, b) = WRAPPER

type instance KIND (Set a) = WRAPPER

type instance KIND (Map k v) = WRAPPER

type instance KIND (Resolver m a) = WRAPPER

type instance KIND (a -> b) = WRAPPER