packages feed

accelerate-llvm-1.4.0.0: src/Data/Array/Accelerate/TH/Compat.hs

{-# LANGUAGE CPP                 #-}
{-# LANGUAGE KindSignatures      #-}
{-# LANGUAGE PolyKinds           #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell     #-}
{-# OPTIONS_HADDOCK hide #-}
-- |
-- Module      : Data.Array.Accelerate.TH.Compat
-- Copyright   : [2019..2021] The Accelerate Team
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Data.Array.Accelerate.TH.Compat (

  module Language.Haskell.TH,
#if! MIN_VERSION_template_haskell(2,17,0)
  module Data.Array.Accelerate.TH.Compat,
#endif

) where

import Language.Haskell.TH

#if !MIN_VERSION_template_haskell(2,17,0)
import Language.Haskell.TH.Syntax                                   ( unTypeQ, unsafeTExpCoerce )
#if MIN_VERSION_template_haskell(2,16,0)
import GHC.Exts                                                     ( RuntimeRep, TYPE )
#endif
#endif


#if !MIN_VERSION_template_haskell(2,17,0)
#if MIN_VERSION_template_haskell(2,16,0)
type Code m (a :: TYPE (r :: RuntimeRep)) = m (TExp a)
type CodeQ (a :: TYPE (r :: RuntimeRep)) = Code Q a

unsafeCodeCoerce :: forall (r :: RuntimeRep) (a :: TYPE r). Q Exp -> CodeQ a
unsafeCodeCoerce = unsafeTExpCoerce

unTypeCode :: forall (r :: RuntimeRep) (a :: TYPE r). CodeQ a -> Q Exp
unTypeCode = unTypeQ

bindCode :: forall m a (r :: RuntimeRep) (b :: TYPE r). Monad m => m a -> (a -> Code m b) -> Code m b
bindCode = (>>=)

#else
type Code m a = m (TExp a)
type CodeQ a = Code Q a

unsafeCodeCoerce :: Q Exp -> Q (TExp a)
unsafeCodeCoerce = unsafeTExpCoerce

unTypeCode :: CodeQ a -> Q Exp
unTypeCode = unTypeQ

bindCode :: Monad m => m a -> (a -> Code m b) -> Code m b
bindCode = (>>=)
#endif
#endif