atomic-primops-0.7: testing/TemplateHaskellSplices.hs
{-# LANGUAGE TemplateHaskell,
RankNTypes #-}
-- | TH splices used in atommic-primops tests.
-- Splices defined in own module for technical reasons.
module TemplateHaskellSplices where
import Language.Haskell.TH
import Control.Monad (replicateM)
tmap :: forall a. (Enum a, Eq a, Num a)
=> a -> Int -> Q Exp
tmap i n = do
f <- newName "f"
as <- replicateM n (newName "a")
lamE [varP f, tupP (map varP as)] $
tupE [ if i == i'
then [| $(varE f) $a |]
else a
| (a,i') <- map varE as `zip` [1..] ]