2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[Maybes]{The `Maybe' types and associated utility functions}
8 module Maybe, -- Re-export all of Maybe
19 thenMaybe, seqMaybe, returnMaybe, failMaybe,
21 thenMaB, returnMaB, failMaB
25 #include "HsVersions.h"
33 %************************************************************************
35 \subsection[Maybe type]{The @Maybe@ type}
37 %************************************************************************
40 maybeToBool :: Maybe a -> Bool
41 maybeToBool Nothing = False
42 maybeToBool (Just x) = True
45 @catMaybes@ takes a list of @Maybe@s and returns a list of
46 the contents of all the @Just@s in it. @allMaybes@ collects
47 a list of @Justs@ into a single @Just@, returning @Nothing@ if there
51 allMaybes :: [Maybe a] -> Maybe [a]
52 allMaybes [] = Just []
53 allMaybes (Nothing : ms) = Nothing
54 allMaybes (Just x : ms) = case (allMaybes ms) of
56 Just xs -> Just (x:xs)
60 @firstJust@ takes a list of @Maybes@ and returns the
61 first @Just@ if there is one, or @Nothing@ otherwise.
64 firstJust :: [Maybe a] -> Maybe a
65 firstJust [] = Nothing
66 firstJust (Just x : ms) = Just x
67 firstJust (Nothing : ms) = firstJust ms
71 expectJust :: String -> Maybe a -> a
72 {-# INLINE expectJust #-}
73 expectJust err (Just x) = x
74 expectJust err Nothing = error ("expectJust " ++ err)
78 mapCatMaybes :: (a -> Maybe b) -> [a] -> [b]
79 mapCatMaybes f [] = []
80 mapCatMaybes f (x:xs) = case f x of
81 Just y -> y : mapCatMaybes f xs
82 Nothing -> mapCatMaybes f xs
88 seqMaybe :: Maybe a -> Maybe a -> Maybe a
89 seqMaybe (Just x) _ = Just x
90 seqMaybe Nothing my = my
92 thenMaybe :: Maybe a -> (a -> Maybe b) -> Maybe b
93 thenMaybe ma mb = case ma of
97 returnMaybe :: a -> Maybe a
103 orElse :: Maybe a -> a -> a
104 (Just x) `orElse` y = x
105 Nothing `orElse` y = y
109 %************************************************************************
111 \subsection[MaybeErr type]{The @MaybeErr@ type}
113 %************************************************************************
116 data MaybeErr val err = Succeeded val | Failed err
120 thenMaB :: MaybeErr val1 err -> (val1 -> MaybeErr val2 err) -> MaybeErr val2 err
126 returnMaB :: val -> MaybeErr val err
127 returnMaB v = Succeeded v
129 failMaB :: err -> MaybeErr val err