2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[Maybes]{The `Maybe' types and associated utility functions}
8 -- Maybe(..), -- no, it's in 1.3
18 mkLookupFun, mkLookupFunDef,
29 #include "HsVersions.h"
31 import Maybe( catMaybes, mapMaybe )
35 %************************************************************************
37 \subsection[Maybe type]{The @Maybe@ type}
39 %************************************************************************
42 maybeToBool :: Maybe a -> Bool
43 maybeToBool Nothing = False
44 maybeToBool (Just x) = True
47 @catMaybes@ takes a list of @Maybe@s and returns a list of
48 the contents of all the @Just@s in it. @allMaybes@ collects
49 a list of @Justs@ into a single @Just@, returning @Nothing@ if there
53 allMaybes :: [Maybe a] -> Maybe [a]
54 allMaybes [] = Just []
55 allMaybes (Nothing : ms) = Nothing
56 allMaybes (Just x : ms) = case (allMaybes ms) of
58 Just xs -> Just (x:xs)
62 @firstJust@ takes a list of @Maybes@ and returns the
63 first @Just@ if there is one, or @Nothing@ otherwise.
66 firstJust :: [Maybe a] -> Maybe a
67 firstJust [] = Nothing
68 firstJust (Just x : ms) = Just x
69 firstJust (Nothing : ms) = firstJust ms
73 findJust :: (a -> Maybe b) -> [a] -> Maybe b
74 findJust f [] = Nothing
75 findJust f (a:as) = case f a of
76 Nothing -> findJust f as
81 expectJust :: String -> Maybe a -> a
82 {-# INLINE expectJust #-}
83 expectJust err (Just x) = x
84 expectJust err Nothing = error ("expectJust " ++ err)
90 seqMaybe :: Maybe a -> Maybe a -> Maybe a
91 seqMaybe (Just x) _ = Just x
92 seqMaybe Nothing my = my
94 returnMaybe :: a -> Maybe a
104 @assocMaybe@ looks up in an assocation list, returning
105 @Nothing@ if it fails.
108 assocMaybe :: (Eq a) => [(a,b)] -> a -> Maybe b
114 lookup ((tv,ty):rest) = if key == tv then Just ty else lookup rest
117 @mkLookupFun eq alist@ is a function which looks up
118 its argument in the association list @alist@, returning a Maybe type.
119 @mkLookupFunDef@ is similar except that it is given a value to return
123 mkLookupFun :: (key -> key -> Bool) -- Equality predicate
124 -> [(key,val)] -- The assoc list
126 -> Maybe val -- The corresponding value
128 mkLookupFun eq alist s
129 = case [a | (s',a) <- alist, s' `eq` s] of
133 mkLookupFunDef :: (key -> key -> Bool) -- Equality predicate
134 -> [(key,val)] -- The assoc list
135 -> val -- Value to return on failure
137 -> val -- The corresponding value
139 mkLookupFunDef eq alist deflt s
140 = case [a | (s',a) <- alist, s' `eq` s] of
145 %************************************************************************
147 \subsection[MaybeErr type]{The @MaybeErr@ type}
149 %************************************************************************
152 data MaybeErr val err = Succeeded val | Failed err
156 thenMaB :: MaybeErr val1 err -> (val1 -> MaybeErr val2 err) -> MaybeErr val2 err
162 returnMaB :: val -> MaybeErr val err
163 returnMaB v = Succeeded v
165 failMaB :: err -> MaybeErr val err