module Types.Data.Num.Decimal.Literals.TH where
import Language.Haskell.TH
decLiteralT :: Integer -> Q Type
decLiteralT n = appT (conT (mkName "Dec")) (decLiteralT' n)
where decLiteralT' n | n < 0 = appT (conT (mkName "Neg'")) (decLiteralT' (n))
| n == 0 = conT (mkName "DecN")
| otherwise = appT (appT (conT (mkName ":.")) (decLiteralT' (n `div` 10))) (conT (mkName ("Dec" ++ show (n `mod` 10))))
decLiteralD :: String
-> String
-> Integer
-> Q [Dec]
decLiteralD typePrefix valPrefix n =
do let suffix = if n < 0 then "N" ++ show (n) else show n
typeName = mkName $ typePrefix ++ suffix
valName = mkName $ valPrefix ++ suffix
tySyn <- tySynD typeName [] (decLiteralT n)
sig <- sigD valName (conT typeName)
val <- valD (varP valName) (normalB [| undefined |]) []
return [ tySyn, sig, val ]
decLiteralsD :: String
-> String
-> Integer
-> Integer
-> Q [Dec]
decLiteralsD typePrefix valPrefix from to =
fmap concat $ sequence $ [ decLiteralD typePrefix valPrefix n | n <- [from..to] ]