{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 800
{-# LANGUAGE TemplateHaskellQuotes #-}
#endif
-- | This module provides TH helpers,
-- which use 'Solo' from this package, for 1-tuples.
module Data.Tuple.Solo.TH (
    tupE,
) where


#if MIN_VERSION_template_haskell(2,17,0)
import Language.Haskell.TH (tupE)
#else
import Data.Tuple.Solo

import qualified Language.Haskell.TH as TH
import qualified Language.Haskell.TH.Syntax as TH

makeTup :: [TH.Exp] -> TH.Exp
makeTup [x] = TH.AppE (TH.ConE soloConName) x
#if MIN_VERSION_template_haskell(2,16,0)
makeTup xs  = TH.TupE (map Just xs)
#else
makeTup xs  = TH.TupE xs
#endif

soloConName :: TH.Name
#if __GLASGOW_HASKELL__ >= 800
soloConName = 'Solo
#else
#ifndef CURRENT_PACKAGE_KEY 
#error "CURRENT_PACKAGE_KEY undefined"
#endif

soloConName = TH.mkNameG_d CURRENT_PACKAGE_KEY "Data.Tuple.Solo" "MkSolo"
#endif

tupE :: Monad m => [m TH.Exp] -> m TH.Exp
tupE xs = do
    xs' <- sequence xs
    return (makeTup xs')
#endif