]> gitweb @ CieloNegro.org - hs-rrdtool.git/blobdiff - Types/Data/Map.hs
working on graphs...
[hs-rrdtool.git] / Types / Data / Map.hs
index 6cb61c62b2f5bc015a29eb141b736c9d722a5689..9f12a5d56e9afe3186aa216c17bfc2aac40fd847 100644 (file)
@@ -90,18 +90,16 @@ type instance Size Tip             = D0
 type instance Size (Bin s k v l r) = s
 
 -- CompCase
-type CompCase a b ifLT ifGT ifEQ
-    = If (IsLT (Compare a b))
-         ifLT
-         (If (IsGT (Compare a b))
-             ifGT
-             ifEQ)
+type family   CompCase o  ifLT ifGT ifEQ
+type instance CompCase LT ifLT ifGT ifEQ = ifLT
+type instance CompCase GT ifLT ifGT ifEQ = ifGT
+type instance CompCase EQ ifLT ifGT ifEQ = ifEQ
 
 -- Lookup
 type family   Lookup k m
 type instance Lookup k Tip              = Nothing
 type instance Lookup k (Bin s k' v l r)
-    = CompCase k k'
+    = CompCase (Compare k k')
                (Lookup k l)
                (Lookup k r)
                (Just v)
@@ -110,7 +108,7 @@ type instance Lookup k (Bin s k' v l r)
 type family   LookupAssoc k m
 type instance LookupAssoc k Tip              = Nothing
 type instance LookupAssoc k (Bin s k' v l r)
-    = CompCase k k'
+    = CompCase (Compare k k')
                (LookupAssoc k l)
                (LookupAssoc k r)
                (Just (Cons k v))
@@ -138,7 +136,7 @@ type Singleton k v = Bin D1 k v Tip Tip
 type family   Insert k v m
 type instance Insert k v Tip              = Singleton k v
 type instance Insert k v (Bin s k' v' l r)
-    = CompCase k k'
+    = CompCase (Compare k k')
                (Balance k' v' (Insert k v l) r)
                (Balance k' v' l (Insert k v r))
                (Bin s k v l r)
@@ -147,7 +145,7 @@ type instance Insert k v (Bin s k' v' l r)
 type family   Delete k m
 type instance Delete k Tip              = Tip
 type instance Delete k (Bin s k' v l r)
-    = CompCase k k'
+    = CompCase (Compare k k')
                (Balance k' v (Delete k l) r)
                (Balance k' v l (Delete k r))
                (Glue l r)
@@ -158,12 +156,14 @@ type Ratio = D2
 
 type Balance k v l r
     = If ((Size l :+: Size r) :<=: D1)
-         (Bin (Size l :+: Size r :+: D1) k v l r)
+         (Bin (SizeX l r) k v l r)
          (If (Size r :>=: (Delta :*: Size l))
              (RotateL k v l r)
              (If (Size l :>=: (Delta :*: Size r))
                  (RotateR k v l r)
-                 (Bin (Size l :+: Size r :+: D1) k v l r)))
+                 (Bin (SizeX l r) k v l r)))
+
+type SizeX l r = Size l :+: Size r :+: D1
 
 -- Rotate
 type family   RotateL k v l r
@@ -282,12 +282,14 @@ type instance App2 (AdjustWithKey' f) k v = Just (App2 f k v)
 type family   UpdateWithKey f k m
 type instance UpdateWithKey f k Tip              = Tip
 type instance UpdateWithKey f k (Bin s k' v l r)
-    = CompCase k k'
+    = CompCase (Compare k k')
                (Balance k' v (UpdateWithKey f k l) r)
                (Balance k' v l (UpdateWithKey f k r))
-               (If (IsJust (App2 f k' v))
-                   (Bin s k' (FromJust (App2 f k' v)) l r)
-                   (Glue l r))
+               (UpdateWithKey' s k' (App2 f k' v) l r)
+
+type family   UpdateWithKey' s k mv l r
+type instance UpdateWithKey' s k (Just v) l r = Bin s k v l r
+type instance UpdateWithKey' s k Nothing  l r = Glue l r
 
 -- Map
 type MapValue f m = MapWithKey (MapValue' f) m