[add constrained iteration
John Meacham <john@repetae.net>**20060420000427] hunk ./Main.hs 158
-    transformProgram "Barendregt" False (dump FD.Pass) (return . barendregtProgram) prog
+    transformProgram "Barendregt" DontIterate (dump FD.Pass) (return . barendregtProgram) prog
hunk ./Main.hs 297
-        mprog <- transformProgram "floatOutward" False (dump FD.Pass) floatOutward mprog
+        mprog <- transformProgram "floatOutward" DontIterate (dump FD.Pass) floatOutward mprog
hunk ./Main.hs 301
-        mprog <- transformProgram "float inward" False (dump FD.Pass) (programMapBodies (return . floatInward allRules)) mprog
+        mprog <- transformProgram "float inward" DontIterate (dump FD.Pass) (programMapBodies (return . floatInward allRules)) mprog
hunk ./Main.hs 330
-    prog <- transformProgram "typeAnalyze" False (dump FD.Pass) (typeAnalyze True) prog
+    prog <- transformProgram "typeAnalyze" DontIterate (dump FD.Pass) (typeAnalyze True) prog
hunk ./Main.hs 428
-    prog <- transformProgram "typeAnalyze" False True (typeAnalyze True) prog
+    prog <- transformProgram "typeAnalyze" DontIterate True (typeAnalyze True) prog
hunk ./Main.hs 454
-programPrune prog = transformProgram "Prune Unreachable" False (dump FD.Pass) (return . programPruneUnreachable) prog
+programPrune prog = transformProgram "Prune Unreachable" DontIterate (dump FD.Pass) (return . programPruneUnreachable) prog
hunk ./Main.hs 459
-    transformProgram "eta expansion" False (dump FD.Pass) (const $ return prog' { progStats = progStats prog' `mappend` stats }) prog
+    transformProgram "eta expansion" DontIterate (dump FD.Pass) (const $ return prog' { progStats = progStats prog' `mappend` stats }) prog
hunk ./Main.hs 503
-    prog <- transformProgram "Initial Prune Unreachable" False True (return . programPruneUnreachable) prog
+    prog <- transformProgram "Initial Prune Unreachable" DontIterate True (return . programPruneUnreachable) prog
hunk ./Main.hs 537
-        prog <- transformProgram "lambda lift" False (dump FD.Progress) (lambdaLift finalStats) prog
+        prog <- transformProgram "lambda lift" DontIterate (dump FD.Progress) (lambdaLift finalStats) prog
hunk ./Main.hs 555
-    prog <- transformProgram "typeAnalyze after method" False True (typeAnalyze True) prog
+    prog <- transformProgram "typeAnalyze after method" DontIterate True (typeAnalyze True) prog
hunk ./Main.hs 566
-    prog <- transformProgram "typeAnalyze" False True (typeAnalyze True) prog
+    prog <- transformProgram "typeAnalyze" DontIterate True (typeAnalyze True) prog
hunk ./Main.hs 603
-    prog <- transformProgram "lambda lift" False (dump FD.Progress) (lambdaLift finalStats) prog
+    prog <- transformProgram "lambda lift" DontIterate (dump FD.Progress) (lambdaLift finalStats) prog
hunk ./Main.hs 737
-    prog <- transformProgram name True dodump g prog  { progStats = mempty }
+    prog <- transformProgram name IterateDone dodump g prog  { progStats = mempty }
hunk ./Main.hs 744
-    prog <- transformProgram ("PS:" ++ name) True dodump g prog  { progStats = mempty }
+    prog <- transformProgram ("PS:" ++ name) IterateDone dodump g prog  { progStats = mempty }
hunk ./Main.hs 750
+data Iterate = DontIterate | IterateMax !Int | IterateExactly !Int | IterateDone
+    deriving(Eq)
+
+doIterate (IterateMax _) stat | stat /= mempty = True
+doIterate IterateDone stat | stat /= mempty = True
+doIterate IterateExactly {} _ = True
+doIterate _ _ = False
+
+iterateStep (IterateMax n) = IterateMax (n - 1)
+iterateStep (IterateExactly n) = IterateExactly (n - 1)
+iterateStep x = x
+
hunk ./Main.hs 764
-    -> Bool                     -- ^ wether to iterate
+    -> Iterate                     -- ^ wether to iterate
hunk ./Main.hs 770
+transformProgram _ (IterateMax n) _ _ prog | n <= 0 = return prog
+transformProgram _ (IterateExactly n) _ _ prog | n <= 0 = return prog
hunk ./Main.hs 793
-    if iterate && estat /= mempty then transformProgram name True dodump f prog' { progStats = istat `mappend` estat } else
+    if doIterate iterate estat then transformProgram name (iterateStep iterate) dodump f prog' { progStats = istat `mappend` estat } else
hunk ./Main.hs 796
+
+