[project @ 2005-03-10 14:03:28 by simonmar]
[ghc-hetmet.git] / ghc / compiler / utils / Maybes.lhs
index abaf1c1..3c9bd69 100644 (file)
@@ -5,46 +5,29 @@
 
 \begin{code}
 module Maybes (
-       Maybe2(..), Maybe3(..),
-       MaybeErr(..),
+       module Maybe,           -- Re-export all of Maybe
+
+       MaybeErr(..),   -- Instance of Monad
+       failME,
 
        orElse, 
-       mapMaybe,
+       mapCatMaybes,
        allMaybes,
        firstJust,
        expectJust,
        maybeToBool,
 
-       failMaB,
-       failMaybe,
-       seqMaybe,
-       returnMaB,
-       returnMaybe,
-       thenMaB,
-       catMaybes
+       thenMaybe, seqMaybe, returnMaybe, failMaybe
     ) where
 
 #include "HsVersions.h"
 
-import Maybe( catMaybes, mapMaybe )
+import Maybe
 
 
 infixr 4 `orElse`
 \end{code}
 
-
-%************************************************************************
-%*                                                                     *
-\subsection[Maybe2,3 types]{The @Maybe2@ and @Maybe3@ types}
-%*                                                                     *
-%************************************************************************
-
-\begin{code}
-data Maybe2 a b   = Just2 a b   | Nothing2  deriving (Eq,Show)
-data Maybe3 a b c = Just3 a b c | Nothing3  deriving (Eq,Show)
-\end{code}
-
-
 %************************************************************************
 %*                                                                     *
 \subsection[Maybe type]{The @Maybe@ type}
@@ -83,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}
@@ -104,6 +87,11 @@ seqMaybe :: Maybe a -> Maybe a -> Maybe a
 seqMaybe (Just x) _  = Just x
 seqMaybe Nothing  my = my
 
+thenMaybe :: Maybe a -> (a -> Maybe b) -> Maybe b
+thenMaybe ma mb = case ma of
+                   Just x  -> mb x
+                   Nothing -> Nothing
+
 returnMaybe :: a -> Maybe a
 returnMaybe = Just
 
@@ -123,20 +111,13 @@ Nothing  `orElse` y = y
 %************************************************************************
 
 \begin{code}
-data MaybeErr val err = Succeeded val | Failed err
-\end{code}
+data MaybeErr err val = Succeeded val | Failed err
 
-\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
+instance Monad (MaybeErr err) where
+  return v = Succeeded v
+  Succeeded v >>= k = k v
+  Failed e    >>= k = Failed e
 
-returnMaB :: val -> MaybeErr val err
-returnMaB v = Succeeded v
-
-failMaB :: err -> MaybeErr val err
-failMaB e = Failed e
+failME :: err -> MaybeErr err val
+failME e = Failed e
 \end{code}
-