\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`
\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}
%************************************************************************
\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}
-