author Ian Lynagh Tue, 4 May 2010 18:03:02 +0000 (18:03 +0000) committer Ian Lynagh Tue, 4 May 2010 18:03:02 +0000 (18:03 +0000)
In GHC 6.10, intersectionWith is (a -> b -> a) instead of (a -> b -> c),
so we need to jump through some hoops to get the more general type.

index 293e48e..19b1428 100644 (file)
@@ -183,7 +183,20 @@ plusUFM (UFM x) (UFM y) = UFM (M.union y x)
plusUFM_C f (UFM x) (UFM y) = UFM (M.unionWith f x y)
minusUFM (UFM x) (UFM y) = UFM (M.difference x y)
intersectUFM (UFM x) (UFM y) = UFM (M.intersection x y)
intersectUFM_C f (UFM x) (UFM y) = UFM (M.intersectionWith f x y)
+#else
+-- In GHC 6.10, intersectionWith is (a -> b -> a) instead of (a -> b -> c),
+-- so we need to jump through some hoops to get the more general type.
+intersectUFM_C f (UFM x) (UFM y) = UFM z
+    where z = let x' = M.map Left x
+                  f' (Left a) b = Right (f a b)
+                  f' (Right _) _ = panic "intersectUFM_C: f': Right"
+                  z' = M.intersectionWith f' x' y
+                  fromRight (Right a) = a
+                  fromRight _ = panic "intersectUFM_C: Left"
+              in M.map fromRight z'
+#endif

foldUFM k z (UFM m) = M.fold k z m
foldUFM_Directly k z (UFM m) = M.foldWithKey (k . getUnique) z m