-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Derive.TopDown
-- Copyright   :  (c) Song Zhang
-- License     :  BSD-style (see the LICENSE file)
-- 
-- Maintainer  :  haskell.zhang.song `at` hotmail.com
-- Stability   :  experimental
-- Portability :  non-portable
--
-----------------------------------------------------------------------------

module Data.Derive.TopDown (
   module Data.Derive.TopDown.Standalone
 , module Data.Derive.TopDown.Instance
 , module Data.Derive.TopDown.TH
 , module Data.Derive.TopDown.CxtGen
 , char, int, int8, int16, int32, int64, word, word8, word16, word32, word64
 , primitives, state, realWorld
#if __GLASGOW_HASKELL__ >= 802
 , stock, anyclass, newtype_
 , DerivStrategy(StockStrategy, AnyclassStrategy, NewtypeStrategy)
#endif
)
where

#if __GLASGOW_HASKELL__ >= 802
import Language.Haskell.TH.Syntax
#endif
import Data.Derive.TopDown.Standalone
import Data.Derive.TopDown.Instance
import Data.Derive.TopDown.TH
import Data.Derive.TopDown.CxtGen

#if __GLASGOW_HASKELL__ >= 802
{-|
The name @sock@ and @anyclass@ are still allowed to be used as functions or arguments. 
See <https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/DerivingStrategies>
-}
stock, anyclass, newtype_ :: DerivStrategy
stock :: DerivStrategy
stock     = DerivStrategy
StockStrategy
anyclass :: DerivStrategy
anyclass  = DerivStrategy
AnyclassStrategy
newtype_ :: DerivStrategy
newtype_  = DerivStrategy
NewtypeStrategy
#endif


-- | @Char#@ type
char :: Name
char :: Name
char   = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"Char#")   (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))
-- | @Int#@ type
int :: Name
int :: Name
int    = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"Int#")    (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))
-- | @Int8#@ type
int8 :: Name
int8 :: Name
int8   = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"Int8#")   (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))
-- | @Int16#@ type
int16 :: Name
int16 :: Name
int16  = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"Int16#")  (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))
-- | @Int32#@ type
int32 :: Name
int32 :: Name
int32  = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"Int32#")  (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))
-- | @Int64#@ type
int64 :: Name
int64 :: Name
int64  = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"Int64#")  (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))
-- | @Word#@ type
word :: Name
word :: Name
word   = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"Word#")   (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))
-- | @Word8#@ type
word8 :: Name
word8 :: Name
word8  = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"Word8#")  (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))
-- | @Word16#@ type
word16 :: Name
word16 :: Name
word16 = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"Word16#") (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))
-- | @Word32#@ type
word32 :: Name
word32 :: Name
word32 = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"Word32#") (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))
-- | @Word64#@ type
word64 :: Name
word64 :: Name
word64 = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"Word64#") (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))

-- | list of @Name@: @[char, int, int8, int16, int32, int64, word, word8, word16, word32, word64]@
primitives :: [Name]
primitives :: [Name]
primitives = [Name
char, Name
int, Name
int8, Name
int16, Name
int32, Name
int64, Name
word, Name
word8, Name
word16, Name
word32, Name
word64]

-- | @GHC.Prim.State#@ type
state :: Name
state :: Name
state  = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"State#") (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))

-- | @GHC.Prim.RealWorld#@ type
realWorld :: Name
realWorld :: Name
realWorld  = OccName -> NameFlavour -> Name
Name (String -> OccName
mkOccName String
"RealWorld#") (NameSpace -> PkgName -> ModName -> NameFlavour
NameG NameSpace
TcClsName (String -> PkgName
mkPkgName String
"ghc-prim") (String -> ModName
mkModName String
"GHC.Prim"))