[project @ 2005-04-22 10:21:10 by simonmar]
[ghc-hetmet.git] / ghc / compiler / utils / Maybes.lhs
index 353c3b5..3c9bd69 100644 (file)
@@ -5,24 +5,24 @@
 
 \begin{code}
 module Maybes (
-       MaybeErr(..),
+       module Maybe,           -- Re-export all of Maybe
+
+       MaybeErr(..),   -- Instance of Monad
+       failME,
 
        orElse, 
-       mapMaybe,
+       mapCatMaybes,
        allMaybes,
        firstJust,
        expectJust,
        maybeToBool,
 
-       thenMaybe, seqMaybe, returnMaybe, failMaybe, catMaybes,
-
-       thenMaB, returnMaB, failMaB
-
+       thenMaybe, seqMaybe, returnMaybe, failMaybe
     ) where
 
 #include "HsVersions.h"
 
-import Maybe( catMaybes, mapMaybe )
+import Maybe
 
 
 infixr 4 `orElse`
@@ -66,20 +66,20 @@ firstJust (Nothing : ms) = firstJust ms
 \end{code}
 
 \begin{code}
-findJust :: (a -> Maybe b) -> [a] -> Maybe b
-findJust f []    = Nothing
-findJust f (a:as) = case f a of
-                     Nothing -> findJust f as
-                     b  -> b
-\end{code}
-
-\begin{code}
 expectJust :: String -> Maybe a -> a
 {-# INLINE expectJust #-}
 expectJust err (Just x) = x
 expectJust err Nothing  = error ("expectJust " ++ err)
 \end{code}
 
+\begin{code}
+mapCatMaybes :: (a -> Maybe b) -> [a] -> [b]
+mapCatMaybes f [] = []
+mapCatMaybes f (x:xs) = case f x of
+                         Just y  -> y : mapCatMaybes f xs
+                         Nothing -> mapCatMaybes f xs
+\end{code}
+
 The Maybe monad
 ~~~~~~~~~~~~~~~
 \begin{code}
@@ -111,20 +111,13 @@ Nothing  `orElse` y = y
 %************************************************************************
 
 \begin{code}
-data MaybeErr val err = Succeeded val | Failed err
-\end{code}
-
-\begin{code}
-thenMaB :: MaybeErr val1 err -> (val1 -> MaybeErr val2 err) -> MaybeErr val2 err
-thenMaB m k
-  = case m of
-      Succeeded v -> k v
-      Failed e   -> Failed e
+data MaybeErr err val = Succeeded val | Failed err
 
-returnMaB :: val -> MaybeErr val err
-returnMaB v = Succeeded v
+instance Monad (MaybeErr err) where
+  return v = Succeeded v
+  Succeeded v >>= k = k v
+  Failed e    >>= k = Failed e
 
-failMaB :: err -> MaybeErr val err
-failMaB e = Failed e
+failME :: err -> MaybeErr err val
+failME e = Failed e
 \end{code}
-