[commit: ghc] master: Add ListSetOps.removeRedundant (c3b793b)
Simon Peyton Jones
simonpj at microsoft.com
Tue Aug 2 18:58:57 CEST 2011
Repository : ssh://darcs.haskell.org//srv/darcs/ghc
On branch : master
http://hackage.haskell.org/trac/ghc/changeset/c3b793b4cb1850a2aa02de3e428bd4a0d4fcd1d7
>---------------------------------------------------------------
commit c3b793b4cb1850a2aa02de3e428bd4a0d4fcd1d7
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Tue Aug 2 13:35:13 2011 +0100
Add ListSetOps.removeRedundant
It's needed in ghc/InteractiveUI, although not in the compiler itself
>---------------------------------------------------------------
compiler/utils/ListSetOps.lhs | 21 ++++++++++++++++++++-
1 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/compiler/utils/ListSetOps.lhs b/compiler/utils/ListSetOps.lhs
index 83334fb..334fb59 100644
--- a/compiler/utils/ListSetOps.lhs
+++ b/compiler/utils/ListSetOps.lhs
@@ -15,8 +15,11 @@ module ListSetOps (
-- Duplicate handling
hasNoDups, runs, removeDups, findDupsEq,
- equivClasses, equivClassesByUniq
+ equivClasses, equivClassesByUniq,
+ -- Remove redudant elts
+ removeRedundant -- Used in the ghc/InteractiveUI,
+ -- although not in the compiler itself
) where
#include "HsVersions.h"
@@ -208,6 +211,22 @@ findDupsEq _ [] = []
findDupsEq eq (x:xs) | null eq_xs = findDupsEq eq xs
| otherwise = (x:eq_xs) : findDupsEq eq neq_xs
where (eq_xs, neq_xs) = partition (eq x) xs
+
+removeRedundant :: (a -> a -> Bool) -- True <=> discard the *second* argument
+ -> [a] -> [a]
+-- Remove any element y for which
+-- another element x is in the list
+-- and (x `subsumes` y)
+-- Preserves order
+removeRedundant subsumes xs
+ = WARN( length xs > 10, text "removeRedundant" <+> int (length xs) )
+ -- This is a quadratic algorithm :-) so warn if the list gets long
+ go [] xs
+ where
+ go acc [] = reverse acc
+ go acc (x:xs)
+ | any (`subsumes` x) acc = go acc xs
+ | otherwise = go (x : filterOut (x `subsumes`) acc) xs
\end{code}
More information about the Cvs-ghc
mailing list