diff --git a/src/main/scala/leon/purescala/GenTreeOps.scala b/src/main/scala/leon/purescala/GenTreeOps.scala index 2b9f1fcc518abc5e76f9108494258046cb1711cb..08404ae1534f2bf62e6ef4d82355d83f9fe7d1ca 100644 --- a/src/main/scala/leon/purescala/GenTreeOps.scala +++ b/src/main/scala/leon/purescala/GenTreeOps.scala @@ -133,23 +133,8 @@ trait GenTreeOps[SubTree <: Tree] { * @note The mode with applyRec true can diverge if f is not well formed */ def preMap(f: SubTree => Option[SubTree], applyRec : Boolean = false)(e: SubTree): SubTree = { - val rec = preMap(f, applyRec) _ - - val newV = if (applyRec) { - // Apply f as long as it returns Some() - fixpoint { e : SubTree => f(e) getOrElse e } (e) - } else { - f(e) getOrElse e - } - - val Deconstructor(es, builder) = newV - val newEs = es.map(rec) - - if ((newEs zip es).exists { case (bef, aft) => aft ne bef }) { - builder(newEs).copiedFrom(newV) - } else { - newV - } + def g(t: SubTree, u: Unit): (Option[SubTree], Unit) = (f(t), ()) + preMapWithContext[Unit](g, applyRec)(e, ()) }