]> gitweb @ CieloNegro.org - hs-rrdtool.git/commitdiff
implementing type-level strings...
authorPHO <pho@cielonegro.org>
Fri, 23 Apr 2010 04:37:37 +0000 (13:37 +0900)
committerPHO <pho@cielonegro.org>
Fri, 23 Apr 2010 04:37:37 +0000 (13:37 +0900)
Data/HList/Number.hs [new file with mode: 0644]
Data/HList/Prelude.hs
Data/HList/String.hs
rrdtool.cabal

diff --git a/Data/HList/Number.hs b/Data/HList/Number.hs
new file mode 100644 (file)
index 0000000..ed9b513
--- /dev/null
@@ -0,0 +1,58 @@
+module Data.HList.Number
+    ( HNat
+
+    , HZero
+    , hZero
+
+    , HSucc
+    , hSucc
+    , hPred
+
+    , hNatLiteralT
+    , hNatLiteralE
+    , hNatLiteralP
+    )
+    where
+
+import Language.Haskell.TH
+
+
+-- HNat
+class HNat n
+
+-- HZero
+data HZero = HZero deriving Show
+
+instance HNat HZero
+
+hZero :: HZero
+hZero = HZero
+
+-- HSucc
+data HSucc n = HSucc n deriving Show
+
+instance HNat n => HNat (HSucc n)
+
+hSucc :: HNat n => n -> HSucc n
+hSucc = HSucc
+
+hPred :: HNat n => HSucc n -> n
+hPred (HSucc n) = n
+
+-- TH
+hNatLiteralT :: Integral n => n -> Q Type
+hNatLiteralT n
+    | n == 0    = conT (mkName "HZero")
+    | otherwise = appT (conT (mkName "HSucc"))
+                       (hNatLiteralT (n - 1))
+
+hNatLiteralE :: Integral n => n -> Q Exp
+hNatLiteralE n
+    | n == 0    = varE (mkName "hZero")
+    | otherwise = appE (varE (mkName "hSucc"))
+                       (hNatLiteralE (n - 1))
+
+hNatLiteralP :: Integral n => n -> Q Pat
+hNatLiteralP n
+    | n == 0    = varP (mkName "HZero")
+    | otherwise = conP (mkName "HSucc") [hNatLiteralP n]
index b3a88fdb0c2371d20828f9ecf802f993a431d264..3eb7e81cc37e80809878498b610dc86ee15b772a 100644 (file)
@@ -1,3 +1,11 @@
+{-# LANGUAGE DeriveDataTypeable,
+             FlexibleContexts,
+             FlexibleInstances,
+             MultiParamTypeClasses,
+             TypeFamilies,
+             TypeOperators,
+             UndecidableInstances
+  #-}
 module Data.HList.Prelude
     ( HList
 
index a51457ed3a336f055df4ae3866353011cdcdba62..bcec59c6d750ab623878087757d95302453fa7e3 100644 (file)
@@ -1,6 +1,33 @@
 module Data.HList.String
-    (
+    ( HString
+    , hString
     )
     where
 
---import Data.HList.Prelude
+import Data.HList.Number
+import Data.HList.Prelude
+import Language.Haskell.TH
+import Language.Haskell.TH.Quote
+
+
+class HString s
+
+instance HString HNil
+
+instance HNat c => HString (HCons c s)
+
+hString :: QuasiQuoter
+hString = QuasiQuoter quoteStrExp quoteStrPat
+
+quoteStrExp :: String -> ExpQ
+quoteStrExp []     = varE (mkName "hNil")
+quoteStrExp (c:cs) = appsE [ varE (mkName "hCons")
+                           , hNatLiteralE (fromEnum c)
+                           , quoteStrExp cs
+                           ]
+
+quoteStrPat :: String -> PatQ
+quoteStrPat []     = varP (mkName "HNil")
+quoteStrPat (c:cs) = conP (mkName "HCons") [ hNatLiteralP (fromEnum c)
+                                           , quoteStrPat cs
+                                           ]
index 83d74d58925ef53a4be89be1271c7247bf0a62be..2a3a029d6261fd25ccd84ed72ac2a7d56f9eae95 100644 (file)
@@ -23,9 +23,10 @@ Source-Repository head
 
 Library
     Build-Depends:
-        base            == 4.2.*,
-        bindings-librrd == 0.1.*,
-        time            == 1.1.*
+        base             == 4.2.*,
+        bindings-librrd  == 0.1.*,
+        template-haskell == 2.4.*,
+        time             == 1.1.*
 
     Exposed-Modules:
         Database.RRDtool
@@ -33,6 +34,7 @@ Library
         Database.RRDtool.Expression
         Data.HList
         Data.HList.Prelude
+        Data.HList.Number
         Data.HList.String
 
     Extensions: