Make iterateFB inlineable
authorJoachim Breitner <mail@joachim-breitner.de>
Tue, 28 Oct 2014 14:28:59 +0000 (15:28 +0100)
committerJoachim Breitner <mail@joachim-breitner.de>
Tue, 28 Oct 2014 14:30:35 +0000 (15:30 +0100)
When investigating a case of unexpected Call Arity failure I noticed
that iterateFB would not inline as far as desired, as it is recursive.

This patch makes it non-recursive (with a local go), which seem so do
great good.

libraries/base/GHC/List.lhs

index 2d01678..f993ee7 100644 (file)
@@ -352,7 +352,8 @@ iterate f x =  x : iterate f (f x)
 
 {-# NOINLINE [0] iterateFB #-}
 iterateFB :: (a -> b -> b) -> (a -> a) -> a -> b
-iterateFB c f x = x `c` iterateFB c f (f x)
+iterateFB c f x0 = go x0
+  where go x = x `c` go (f x)
 
 {-# RULES
 "iterate"    [~1] forall f x.   iterate f x = build (\c _n -> iterateFB c f x)