%
-% (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,
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}
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
failMaybe :: Maybe a
failMaybe = Nothing
+
+orElse :: Maybe a -> a -> a
+(Just x) `orElse` y = x
+Nothing `orElse` y = y
\end{code}
Lookup functions
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
failMaB :: err -> MaybeErr val err
failMaB e = Failed e
\end{code}
+