]> gitweb @ CieloNegro.org - hs-rrdtool.git/blob - Data/HList/String.hs
implementing type-level strings...
[hs-rrdtool.git] / Data / HList / String.hs
1 module Data.HList.String
2     ( HString
3     , hString
4     )
5     where
6
7 import Data.HList.Number
8 import Data.HList.Prelude
9 import Language.Haskell.TH
10 import Language.Haskell.TH.Quote
11
12
13 class HString s
14
15 instance HString HNil
16
17 instance HNat c => HString (HCons c s)
18
19 hString :: QuasiQuoter
20 hString = QuasiQuoter quoteStrExp quoteStrPat
21
22 quoteStrExp :: String -> ExpQ
23 quoteStrExp []     = varE (mkName "hNil")
24 quoteStrExp (c:cs) = appsE [ varE (mkName "hCons")
25                            , hNatLiteralE (fromEnum c)
26                            , quoteStrExp cs
27                            ]
28
29 quoteStrPat :: String -> PatQ
30 quoteStrPat []     = varP (mkName "HNil")
31 quoteStrPat (c:cs) = conP (mkName "HCons") [ hNatLiteralP (fromEnum c)
32                                            , quoteStrPat cs
33                                            ]