Add fusion RULES for mapMaybe
authorTakano Akio <aljee@hyper.cx>
Wed, 20 Nov 2013 07:30:31 +0000 (16:30 +0900)
committerJoachim Breitner <mail@joachim-breitner.de>
Wed, 4 Dec 2013 11:48:02 +0000 (11:48 +0000)
Data/Maybe.hs

index 245e307..fe2a0ab 100644 (file)
@@ -126,4 +126,16 @@ mapMaybe f (x:xs) =
  case f x of
   Nothing -> rs
   Just r  -> r:rs
-
+{-# NOINLINE [1] mapMaybe #-}
+
+{-# RULES
+"mapMaybe"     [~1] forall f xs. mapMaybe f xs
+                    = build (\c n -> foldr (mapMaybeFB c f) n xs)
+"mapMaybeList" [1]  forall f. foldr (mapMaybeFB (:) f) [] = mapMaybe f
+  #-}
+
+{-# NOINLINE [0] mapMaybeFB #-}
+mapMaybeFB :: (b -> r -> r) -> (a -> Maybe b) -> a -> r -> r
+mapMaybeFB cons f x next = case f x of
+  Nothing -> next
+  Just r -> cons r next