import qualified Data.Traversable as T
import qualified Data.Map as M
-- import qualified Data.Set as S
-import Dyna.XXX.DataUtils
+import Dyna.XXX.DataUtils as XDU
import Dyna.XXX.MonadUtils
import Dyna.Analysis.Mode.Uniq
-> (i' -> m i'')
-> M.Map f [i] -> M.Map f [i'] -> m (M.Map f [i''])
mergeBoundUB q l r lm rm = T.sequence
- $ M.mergeWithKey (\_ a b -> Just $ sequence $ zipWith q a b)
- (fmap (T.mapM l))
- (fmap (T.mapM r))
- lm rm
+ $ XDU.mergeWithKey (\_ a b -> Just $ sequence $ zipWith q a b)
+ (fmap (T.mapM l))
+ (fmap (T.mapM r))
+ lm rm
------------------------------------------------------------------------}}}
mapInOrApp,
-- ** Unification-style utilities
mapSemiprune,
+ -- ** Backports
+ mergeWithKey,
-- * 'Data.Set' utilities
-- ** Quantification
setExists, setForall
go [] (r:rs) = fr r : map fr rs
go (l:ls) [] = fl l : map fl ls
go (l:ls) (r:rs) = fb l r : go ls rs
+
+
+-- | An in-efficient version of map merge, to avoid the need to depend on
+-- containers >=0.5, because that breaks people with GHC 7.4. Sigh.
+mergeWithKey :: Ord k => (k -> a -> b -> Maybe c) -> (M.Map k a -> M.Map k c) -> (M.Map k b -> M.Map k c)
+ -> M.Map k a -> M.Map k b -> M.Map k c
+mergeWithKey f g1 g2 ml mr =
+ let ol = g1 (M.difference ml mr)
+ in let or = g2 (M.difference mr ml)
+ in let mb = M.mapMaybe id $ M.intersectionWithKey f ml mr
+ in M.unions [ol,or,mb]