From d27ea43a1a7e105f5786af2309efda7f06c8be30 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Blanc?= <regwblanc@gmail.com>
Date: Fri, 23 Jul 2010 13:34:25 +0000
Subject: [PATCH]

---
 src/setconstraints/Manip.scala | 20 ++++++++++++++++++++
 src/setconstraints/Tools.scala |  5 +++++
 2 files changed, 25 insertions(+)
 create mode 100644 src/setconstraints/Manip.scala

diff --git a/src/setconstraints/Manip.scala b/src/setconstraints/Manip.scala
new file mode 100644
index 000000000..4d3a91a6c
--- /dev/null
+++ b/src/setconstraints/Manip.scala
@@ -0,0 +1,20 @@
+package setconstraints
+
+import setconstraints.Trees._
+
+object Manip {
+
+  def flatten(f: Formula): Formula = {
+    def flatten0(form: Formula): Formula = form match {
+      case And(fs) => {
+        And(fs.foldLeft(Nil: Seq[Formula])((acc, f) => f match {
+          case And(fs2) => acc ++ fs2.map(flatten0)
+          case f2 => acc :+ flatten0(f2)
+        }))
+      }
+      case f => f
+    }
+    Tools.fix(flatten0, f)
+  }
+
+}
diff --git a/src/setconstraints/Tools.scala b/src/setconstraints/Tools.scala
index 98257a867..8ee7dff83 100644
--- a/src/setconstraints/Tools.scala
+++ b/src/setconstraints/Tools.scala
@@ -8,4 +8,9 @@ object Tools {
 
   def toCaseClasses(classes: Seq[ClassTypeDef]): Seq[CaseClassDef] = 
     classes.filter(_.isInstanceOf[CaseClassDef]).map(_.asInstanceOf[CaseClassDef])
+
+  def fix[A](f: (A) => A, a: A): A = {
+    val res = f(a)
+    if(res == a) a else fix(f, res)
+  }
 }
-- 
GitLab