summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Feuer <david.feuer@gmail.com>2017-05-04 14:16:02 -0400
committerBen Gamari <ben@smart-cactus.org>2017-05-04 18:20:44 -0400
commita660844c0859b7a2e76c15f2fb4abec209afea90 (patch)
tree2f3eced4dc10df4a91deae6e6ae6181c730014bd
parent41a00fa1b9c3f82fc1919e3203488666f3fc75be (diff)
downloadhaskell-a660844c0859b7a2e76c15f2fb4abec209afea90.tar.gz
Add an Eq instance for UniqSet
I left that out by mistake, and it apparently breaks at least one existing plugin. Reviewers: christiaanb, austin, bgamari Reviewed By: bgamari Subscribers: rwbarton, thomie Differential Revision: https://phabricator.haskell.org/D3518
-rw-r--r--compiler/utils/UniqFM.hs17
-rw-r--r--compiler/utils/UniqSet.hs6
2 files changed, 23 insertions, 0 deletions
diff --git a/compiler/utils/UniqFM.hs b/compiler/utils/UniqFM.hs
index 8214f1704b..71a092b28e 100644
--- a/compiler/utils/UniqFM.hs
+++ b/compiler/utils/UniqFM.hs
@@ -55,6 +55,7 @@ module UniqFM (
intersectUFM,
intersectUFM_C,
disjointUFM,
+ equalKeysUFM,
nonDetFoldUFM, foldUFM, nonDetFoldUFM_Directly,
anyUFM, allUFM, seqEltsUFM,
mapUFM, mapUFM_Directly,
@@ -76,6 +77,11 @@ import Outputable
import Data.List (foldl')
import qualified Data.IntMap as M
+#if MIN_VERSION_containers(0,5,9)
+import qualified Data.IntMap.Merge.Lazy as M
+import Control.Applicative (Const (..))
+import qualified Data.Monoid as Mon
+#endif
import qualified Data.IntSet as S
import Data.Typeable
import Data.Data
@@ -339,6 +345,17 @@ nonDetUFMToList (UFM m) = map (\(k, v) -> (getUnique k, v)) $ M.toList m
ufmToIntMap :: UniqFM elt -> M.IntMap elt
ufmToIntMap (UFM m) = m
+-- Determines whether two 'UniqFm's contain the same keys.
+equalKeysUFM :: UniqFM a -> UniqFM b -> Bool
+#if MIN_VERSION_containers(0,5,9)
+equalKeysUFM (UFM m1) (UFM m2) = Mon.getAll $ getConst $
+ M.mergeA (M.traverseMissing (\_ _ -> Const (Mon.All False)))
+ (M.traverseMissing (\_ _ -> Const (Mon.All False)))
+ (M.zipWithAMatched (\_ _ _ -> Const (Mon.All True))) m1 m2
+#else
+equalKeysUFM (UFM m1) (UFM m2) = M.keys m1 == M.keys m2
+#endif
+
-- Instances
#if __GLASGOW_HASKELL__ > 710
diff --git a/compiler/utils/UniqSet.hs b/compiler/utils/UniqSet.hs
index ede900a842..d9d51f4c75 100644
--- a/compiler/utils/UniqSet.hs
+++ b/compiler/utils/UniqSet.hs
@@ -128,6 +128,12 @@ mapUniqSet :: Uniquable b => (a -> b) -> UniqSet a -> UniqSet b
-- the invariant.
newtype UniqSet a = UniqSet {getUniqSet' :: UniqFM a} deriving Data
+
+-- Two 'UniqSet's are considered equal if they contain the same
+-- uniques.
+instance Eq (UniqSet a) where
+ UniqSet a == UniqSet b = equalKeysUFM a b
+
getUniqSet :: UniqSet a -> UniqFM a
getUniqSet = getUniqSet'