From 7d4bcf693fef8ff1fbc28c62d05a083abf6b8512 Mon Sep 17 00:00:00 2001
From: Regis Blanc <regwblanc@gmail.com>
Date: Mon, 21 Mar 2016 19:07:23 +0100
Subject: [PATCH] generic prefold with context

---
 src/main/scala/leon/purescala/SubTreeOps.scala | 15 ++++++++++++++-
 src/main/scala/leon/purescala/Types.scala      |  2 +-
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/main/scala/leon/purescala/SubTreeOps.scala b/src/main/scala/leon/purescala/SubTreeOps.scala
index 1d96f070b..39ed1a455 100644
--- a/src/main/scala/leon/purescala/SubTreeOps.scala
+++ b/src/main/scala/leon/purescala/SubTreeOps.scala
@@ -276,6 +276,19 @@ trait SubTreeOps[SubTree <: Tree]  {
     rec(e, c)
   }
 
+  def preFoldWithContext[C](f: (SubTree, C) => C, combiner: (SubTree, C, Seq[C]) => C)
+                           (e: SubTree, c: C): C = {
+
+    def rec(eIn: SubTree, cIn: C): C = {
+      val ctx = f(eIn, cIn)
+      val Deconstructor(es, _) = eIn
+      val cs = es.map{ rec(_, ctx) }
+      combiner(eIn, ctx, cs)
+    }
+
+    rec(e, c)
+  }
+
   /*
    * =============
    * Auxiliary API
@@ -322,4 +335,4 @@ trait SubTreeOps[SubTree <: Tree]  {
     res
   }
 
-}
\ No newline at end of file
+}
diff --git a/src/main/scala/leon/purescala/Types.scala b/src/main/scala/leon/purescala/Types.scala
index b461a51c6..0ee936c81 100644
--- a/src/main/scala/leon/purescala/Types.scala
+++ b/src/main/scala/leon/purescala/Types.scala
@@ -98,7 +98,7 @@ object Types {
 
     assert(classDef.tparams.size == tps.size)
 
-    def fields = {
+    lazy val fields = {
       val tmap = (classDef.tparams zip tps).toMap
       if (tmap.isEmpty) {
         classDef.fields
-- 
GitLab