From 4a84415d39608b147e8ca5ea117e8253ca4d5090 Mon Sep 17 00:00:00 2001
From: Takano Akio <aljee@hyper.cx>
Date: Wed, 20 Nov 2013 16:30:31 +0900
Subject: [PATCH] Add fusion RULES for mapMaybe

---
 Data/Maybe.hs |   14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/Data/Maybe.hs b/Data/Maybe.hs
index 245e307..fe2a0ab 100644
--- a/Data/Maybe.hs
+++ b/Data/Maybe.hs
@@ -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
-- 
1.7.10.4

