{-
 -      ``Data/Random/Internal/TH''
 -}
{-# LANGUAGE
        TemplateHaskell
  #-}

module Data.Random.Internal.TH where

import Data.Generics
import Language.Haskell.TH

import Data.Word
import Data.Int

integralTypes = 
    [ ''Int,   ''Integer
    , ''Int8,  ''Int16,  ''Int32,  ''Int64
    , ''Word8, ''Word16, ''Word32, ''Word64
    ]

realFloatTypes =
    [ ''Float, ''Double ]

replaceName :: Name -> Name -> Name -> Name
replaceName x y z
    | x == z    = y
    | otherwise = z

replicateInstances standin types decls = do
    decls <- decls
    sequence
        [ everywhereM (mkM (return . replaceName standin t)) dec
        | t <- types
        , dec <- decls
        ]