2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[Maybes]{The `Maybe' types and associated utility functions}
8 Maybe2(..), Maybe3(..),
18 thenMaybe, seqMaybe, returnMaybe, failMaybe, catMaybes,
20 thenMaB, returnMaB, failMaB
24 #include "HsVersions.h"
26 import Maybe( catMaybes, mapMaybe )
33 %************************************************************************
35 \subsection[Maybe2,3 types]{The @Maybe2@ and @Maybe3@ types}
37 %************************************************************************
40 data Maybe2 a b = Just2 a b | Nothing2 deriving (Eq,Show)
41 data Maybe3 a b c = Just3 a b c | Nothing3 deriving (Eq,Show)
45 %************************************************************************
47 \subsection[Maybe type]{The @Maybe@ type}
49 %************************************************************************
52 maybeToBool :: Maybe a -> Bool
53 maybeToBool Nothing = False
54 maybeToBool (Just x) = True
57 @catMaybes@ takes a list of @Maybe@s and returns a list of
58 the contents of all the @Just@s in it. @allMaybes@ collects
59 a list of @Justs@ into a single @Just@, returning @Nothing@ if there
63 allMaybes :: [Maybe a] -> Maybe [a]
64 allMaybes [] = Just []
65 allMaybes (Nothing : ms) = Nothing
66 allMaybes (Just x : ms) = case (allMaybes ms) of
68 Just xs -> Just (x:xs)
72 @firstJust@ takes a list of @Maybes@ and returns the
73 first @Just@ if there is one, or @Nothing@ otherwise.
76 firstJust :: [Maybe a] -> Maybe a
77 firstJust [] = Nothing
78 firstJust (Just x : ms) = Just x
79 firstJust (Nothing : ms) = firstJust ms
83 findJust :: (a -> Maybe b) -> [a] -> Maybe b
84 findJust f [] = Nothing
85 findJust f (a:as) = case f a of
86 Nothing -> findJust f as
91 expectJust :: String -> Maybe a -> a
92 {-# INLINE expectJust #-}
93 expectJust err (Just x) = x
94 expectJust err Nothing = error ("expectJust " ++ err)
100 seqMaybe :: Maybe a -> Maybe a -> Maybe a
101 seqMaybe (Just x) _ = Just x
102 seqMaybe Nothing my = my
104 thenMaybe :: Maybe a -> (a -> Maybe b) -> Maybe b
105 thenMaybe ma mb = case ma of
109 returnMaybe :: a -> Maybe a
115 orElse :: Maybe a -> a -> a
116 (Just x) `orElse` y = x
117 Nothing `orElse` y = y
121 %************************************************************************
123 \subsection[MaybeErr type]{The @MaybeErr@ type}
125 %************************************************************************
128 data MaybeErr val err = Succeeded val | Failed err
132 thenMaB :: MaybeErr val1 err -> (val1 -> MaybeErr val2 err) -> MaybeErr val2 err
138 returnMaB :: val -> MaybeErr val err
139 returnMaB v = Succeeded v
141 failMaB :: err -> MaybeErr val err