{-# LANGUAGE TemplateHaskell #-} {- | Shorthand. The following are equivalent: > hSucc (hSucc hZero) > [$nat'| 2 |] > $(nat 2) -} module XMonad.Config.Alt.QQ where import Language.Haskell.TH.Quote import Language.Haskell.TH import Data.HList nat' :: QuasiQuoter nat' = QuasiQuoter { quoteExp = \n -> nat (read n), quotePat = error "XMonad.Config.Alt.QQ.nat'.quotePat: unimplemented"} nat :: Int -> ExpQ nat n = foldr appE [| hZero |] (replicate n [| hSucc |]) natTy :: Int -> TypeQ natTy n = foldr appT [t| HZero |] (replicate n [t| HSucc |]) decNat :: String -> Int -> Q [Dec] decNat t n = do d <- valD (varP (mkName t)) (normalB (nat n)) [] s <- sigD (mkName t) (natTy n) return [s,d]