{-# LANGUAGE
TemplateHaskell
#-}
module Data.Random.Internal.TH
( replicateInstances
, integralTypes, realFloatTypes
) where
import Data.Generics
import Language.Haskell.TH
import Data.Word
import Data.Int
import Control.Monad
integralTypes :: [Name]
integralTypes :: [Name]
integralTypes =
[ ''Integer
, ''Int, ''Int8, ''Int16, ''Int32, ''Int64
, ''Word, ''Word8, ''Word16, ''Word32, ''Word64
]
realFloatTypes :: [Name]
realFloatTypes :: [Name]
realFloatTypes =
[ ''Float, ''Double ]
replaceName :: Name -> Name -> Name -> Name
replaceName :: Name -> Name -> Name -> Name
replaceName x :: Name
x y :: Name
y z :: Name
z
| Name
x Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
z = Name
y
| Bool
otherwise = Name
z
replicateInstances :: (Monad m, Data t) => Name -> [Name] -> m [t] -> m [t]
replicateInstances :: Name -> [Name] -> m [t] -> m [t]
replicateInstances standin :: Name
standin types :: [Name]
types getDecls :: m [t]
getDecls = ([[t]] -> [t]) -> m [[t]] -> m [t]
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM [[t]] -> [t]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (m [[t]] -> m [t]) -> m [[t]] -> m [t]
forall a b. (a -> b) -> a -> b
$ [m [t]] -> m [[t]]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence
[ do
[t]
decls <- m [t]
getDecls
[m t] -> m [t]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence
[ GenericM m -> t -> m t
forall (m :: * -> *). Monad m => GenericM m -> GenericM m
everywhereM ((Name -> m Name) -> a -> m a
forall (m :: * -> *) a b.
(Monad m, Typeable a, Typeable b) =>
(b -> m b) -> a -> m a
mkM (Name -> m Name
forall (m :: * -> *) a. Monad m => a -> m a
return (Name -> m Name) -> (Name -> Name) -> Name -> m Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> Name -> Name -> Name
replaceName Name
standin Name
t)) t
dec
| t
dec <- [t]
decls
]
| Name
t <- [Name]
types
]