[project @ 1999-10-29 01:16:48 by andy]
[ghc-hetmet.git] / ghc / lib / std / Maybe.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1994-1999
3 %
4 \section[Maybe]{Module @Maybe@}
5
6 The standard Haskell 1.3 library for working with
7 @Maybe@ values.
8
9 \begin{code}
10 {-# OPTIONS -fno-implicit-prelude #-}
11
12 module Maybe
13    (
14      Maybe(Nothing,Just)
15                         -- instance of: Eq, Ord, Show, Read,
16                         --              Functor, Monad, MonadPlus
17
18    , maybe              -- :: b -> (a -> b) -> Maybe a -> b
19
20    , isJust             -- :: Maybe a -> Bool
21    , isNothing          -- :: Maybe a -> Bool
22    , fromJust           -- :: Maybe a -> a
23    , fromMaybe          -- :: a -> Maybe a -> a
24    , listToMaybe        -- :: [a] -> Maybe a
25    , maybeToList        -- :: Maybe a -> [a]
26    , catMaybes          -- :: [Maybe a] -> [a]
27    , mapMaybe           -- :: (a -> Maybe b) -> [a] -> [b]
28
29      -- Implementation checked wrt. Haskell 98 lib report, 1/99.
30    ) where
31
32 #ifndef __HUGS__
33 import PrelErr  ( error )
34 import PrelList
35 import PrelMaybe
36 import PrelBase
37 #endif
38 \end{code}
39
40
41 %*********************************************************
42 %*                                                      *
43 \subsection{Functions}
44 %*                                                      *
45 %*********************************************************
46
47 \begin{code}
48 isJust         :: Maybe a -> Bool
49 isJust Nothing = False
50 isJust _       = True
51
52 isNothing         :: Maybe a -> Bool
53 isNothing Nothing = True
54 isNothing _       = False
55
56 fromJust          :: Maybe a -> a
57 fromJust Nothing  = error "Maybe.fromJust: Nothing" -- yuck
58 fromJust (Just x) = x
59
60 fromMaybe     :: a -> Maybe a -> a
61 fromMaybe d x = case x of {Nothing -> d;Just v  -> v}
62
63 maybeToList            :: Maybe a -> [a]
64 maybeToList  Nothing   = []
65 maybeToList  (Just x)  = [x]
66
67 listToMaybe           :: [a] -> Maybe a
68 listToMaybe []        =  Nothing
69 listToMaybe (a:_)     =  Just a
70  
71 catMaybes              :: [Maybe a] -> [a]
72 catMaybes ls = [x | Just x <- ls]
73
74 mapMaybe          :: (a -> Maybe b) -> [a] -> [b]
75 mapMaybe _ []     = []
76 mapMaybe f (x:xs) =
77  let rs = mapMaybe f xs in
78  case f x of
79   Nothing -> rs
80   Just r  -> r:rs
81
82 \end{code}
83