[project @ 2000-08-09 11:39:02 by simonmar]
[ghc-hetmet.git] / ghc / compiler / utils / Maybes.lhs
index b29dd9c..6dd9251 100644 (file)
@@ -1,15 +1,14 @@
 %
-% (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
+% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
 %
 \section[Maybes]{The `Maybe' types and associated utility functions}
 
 \begin{code}
-#include "HsVersions.h"
-
 module Maybes (
---     Maybe(..), -- no, it's in 1.3
+       Maybe2(..), Maybe3(..),
        MaybeErr(..),
 
+       orElse, 
        mapMaybe,
        allMaybes,
        firstJust,
@@ -28,13 +27,24 @@ module Maybes (
        catMaybes
     ) where
 
-CHK_Ubiq()             -- debugging consistency check
-import Unique  (Unique)        -- only for specialising
+#include "HsVersions.h"
 
-#if __GLASGOW_HASKELL__ >= 204
 import Maybe( catMaybes, mapMaybe )
-#endif
 
+
+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}
 
 
@@ -63,19 +73,6 @@ allMaybes (Just x  : ms) = case (allMaybes ms) of
                             Nothing -> Nothing
                             Just xs -> Just (x:xs)
 
-#if __GLASGOW_HASKELL__ < 204
-       -- After 2.04 we get these from the library Maybe
-catMaybes :: [Maybe a] -> [a]
-catMaybes []               = []
-catMaybes (Nothing : xs)   = catMaybes xs
-catMaybes (Just x : xs)           = (x : catMaybes xs)
-
-mapMaybe :: (a -> Maybe b) -> [a] -> [b]
-mapMaybe f [] = []
-mapMaybe f (x:xs) = case f x of
-                       Just y  -> y : mapMaybe f xs
-                       Nothing -> mapMaybe f xs
-#endif
 \end{code}
 
 @firstJust@ takes a list of @Maybes@ and returns the
@@ -115,6 +112,10 @@ returnMaybe = Just
 
 failMaybe :: Maybe a
 failMaybe = Nothing
+
+orElse :: Maybe a -> a -> a
+(Just x) `orElse` y = x
+Nothing  `orElse` y = y
 \end{code}
 
 Lookup functions
@@ -131,12 +132,6 @@ assocMaybe alist key
   where
     lookup []            = Nothing
     lookup ((tv,ty):rest) = if key == tv then Just ty else lookup rest
-
-{-# SPECIALIZE assocMaybe
-       :: [(FAST_STRING,   b)] -> FAST_STRING -> Maybe b
-        , [(Int,           b)] -> Int         -> Maybe b
-        , [(Unique,        b)] -> Unique      -> Maybe b
-  #-}
 \end{code}
 
 @mkLookupFun eq alist@ is a function which looks up
@@ -190,3 +185,4 @@ returnMaB v = Succeeded v
 failMaB :: err -> MaybeErr val err
 failMaB e = Failed e
 \end{code}
+