2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[Maybes]{The `Maybe' types and associated utility functions}
8 Maybe2(..), Maybe3(..),
27 #include "HsVersions.h"
29 import Maybe( catMaybes, mapMaybe )
36 %************************************************************************
38 \subsection[Maybe2,3 types]{The @Maybe2@ and @Maybe3@ types}
40 %************************************************************************
43 data Maybe2 a b = Just2 a b | Nothing2 deriving (Eq,Show)
44 data Maybe3 a b c = Just3 a b c | Nothing3 deriving (Eq,Show)
48 %************************************************************************
50 \subsection[Maybe type]{The @Maybe@ type}
52 %************************************************************************
55 maybeToBool :: Maybe a -> Bool
56 maybeToBool Nothing = False
57 maybeToBool (Just x) = True
60 @catMaybes@ takes a list of @Maybe@s and returns a list of
61 the contents of all the @Just@s in it. @allMaybes@ collects
62 a list of @Justs@ into a single @Just@, returning @Nothing@ if there
66 allMaybes :: [Maybe a] -> Maybe [a]
67 allMaybes [] = Just []
68 allMaybes (Nothing : ms) = Nothing
69 allMaybes (Just x : ms) = case (allMaybes ms) of
71 Just xs -> Just (x:xs)
75 @firstJust@ takes a list of @Maybes@ and returns the
76 first @Just@ if there is one, or @Nothing@ otherwise.
79 firstJust :: [Maybe a] -> Maybe a
80 firstJust [] = Nothing
81 firstJust (Just x : ms) = Just x
82 firstJust (Nothing : ms) = firstJust ms
86 findJust :: (a -> Maybe b) -> [a] -> Maybe b
87 findJust f [] = Nothing
88 findJust f (a:as) = case f a of
89 Nothing -> findJust f as
94 expectJust :: String -> Maybe a -> a
95 {-# INLINE expectJust #-}
96 expectJust err (Just x) = x
97 expectJust err Nothing = error ("expectJust " ++ err)
103 seqMaybe :: Maybe a -> Maybe a -> Maybe a
104 seqMaybe (Just x) _ = Just x
105 seqMaybe Nothing my = my
107 returnMaybe :: a -> Maybe a
113 orElse :: Maybe a -> a -> a
114 (Just x) `orElse` y = x
115 Nothing `orElse` y = y
119 %************************************************************************
121 \subsection[MaybeErr type]{The @MaybeErr@ type}
123 %************************************************************************
126 data MaybeErr val err = Succeeded val | Failed err
130 thenMaB :: MaybeErr val1 err -> (val1 -> MaybeErr val2 err) -> MaybeErr val2 err
136 returnMaB :: val -> MaybeErr val err
137 returnMaB v = Succeeded v
139 failMaB :: err -> MaybeErr val err