2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[Maybes]{The `Maybe' types and associated utility functions}
8 -- Maybe(..), -- no, it's in 1.3
19 mkLookupFun, mkLookupFunDef,
30 #include "HsVersions.h"
32 import Maybe( catMaybes, mapMaybe )
39 %************************************************************************
41 \subsection[Maybe type]{The @Maybe@ type}
43 %************************************************************************
46 maybeToBool :: Maybe a -> Bool
47 maybeToBool Nothing = False
48 maybeToBool (Just x) = True
51 @catMaybes@ takes a list of @Maybe@s and returns a list of
52 the contents of all the @Just@s in it. @allMaybes@ collects
53 a list of @Justs@ into a single @Just@, returning @Nothing@ if there
57 allMaybes :: [Maybe a] -> Maybe [a]
58 allMaybes [] = Just []
59 allMaybes (Nothing : ms) = Nothing
60 allMaybes (Just x : ms) = case (allMaybes ms) of
62 Just xs -> Just (x:xs)
66 @firstJust@ takes a list of @Maybes@ and returns the
67 first @Just@ if there is one, or @Nothing@ otherwise.
70 firstJust :: [Maybe a] -> Maybe a
71 firstJust [] = Nothing
72 firstJust (Just x : ms) = Just x
73 firstJust (Nothing : ms) = firstJust ms
77 findJust :: (a -> Maybe b) -> [a] -> Maybe b
78 findJust f [] = Nothing
79 findJust f (a:as) = case f a of
80 Nothing -> findJust f as
85 expectJust :: String -> Maybe a -> a
86 {-# INLINE expectJust #-}
87 expectJust err (Just x) = x
88 expectJust err Nothing = error ("expectJust " ++ err)
94 seqMaybe :: Maybe a -> Maybe a -> Maybe a
95 seqMaybe (Just x) _ = Just x
96 seqMaybe Nothing my = my
98 returnMaybe :: a -> Maybe a
104 orElse :: Maybe a -> a -> a
105 (Just x) `orElse` y = x
106 Nothing `orElse` y = y
112 @assocMaybe@ looks up in an assocation list, returning
113 @Nothing@ if it fails.
116 assocMaybe :: (Eq a) => [(a,b)] -> a -> Maybe b
122 lookup ((tv,ty):rest) = if key == tv then Just ty else lookup rest
125 @mkLookupFun eq alist@ is a function which looks up
126 its argument in the association list @alist@, returning a Maybe type.
127 @mkLookupFunDef@ is similar except that it is given a value to return
131 mkLookupFun :: (key -> key -> Bool) -- Equality predicate
132 -> [(key,val)] -- The assoc list
134 -> Maybe val -- The corresponding value
136 mkLookupFun eq alist s
137 = case [a | (s',a) <- alist, s' `eq` s] of
141 mkLookupFunDef :: (key -> key -> Bool) -- Equality predicate
142 -> [(key,val)] -- The assoc list
143 -> val -- Value to return on failure
145 -> val -- The corresponding value
147 mkLookupFunDef eq alist deflt s
148 = case [a | (s',a) <- alist, s' `eq` s] of
153 %************************************************************************
155 \subsection[MaybeErr type]{The @MaybeErr@ type}
157 %************************************************************************
160 data MaybeErr val err = Succeeded val | Failed err
164 thenMaB :: MaybeErr val1 err -> (val1 -> MaybeErr val2 err) -> MaybeErr val2 err
170 returnMaB :: val -> MaybeErr val err
171 returnMaB v = Succeeded v
173 failMaB :: err -> MaybeErr val err