]> gitweb @ CieloNegro.org - hs-rrdtool.git/blobdiff - Data/HList/Prelude.hs
HString and HLength
[hs-rrdtool.git] / Data / HList / Prelude.hs
index 3eb7e81cc37e80809878498b610dc86ee15b772a..3ab596ffb1e45c2aacf9484384b5f9334e454f81 100644 (file)
@@ -27,10 +27,13 @@ module Data.HList.Prelude
     , HFoldrable(..)
     , HConcatable(..)
     , HMappable(..)
+
+    , HLength(..)
     )
     where
 
 import Data.Typeable
+import Types.Data.Num hiding ((:*:))
 
 
 -- HList
@@ -153,3 +156,18 @@ instance ( Applyable f x
          ) => HMappable f (HCons x xs) where
     type HMap f (HCons x xs) = HCons (Apply f x) (HMap f xs)
     hMap f (HCons x xs) = hCons (apply f x) (hMap f xs)
+
+-- HLength
+class IntegerT (HLengthOf l) => HLength l where
+    type HLengthOf l
+    hLength :: Integral n => l -> n
+
+instance HLength HNil where
+    type HLengthOf HNil = D0
+    hLength _ = 0
+
+instance ( HLength l
+         , IntegerT (Succ (HLengthOf l))
+         ) => HLength (HCons e l) where
+    type HLengthOf (HCons e l) = Succ (HLengthOf l)
+    hLength (HCons _ l) = 1 + hLength l