4b7b67e305445c9c4f3201fd7282d78a393b5ce0
[ghc-base.git] / Data / Maybe.hs
1 {-# OPTIONS -fno-implicit-prelude #-}
2 -----------------------------------------------------------------------------
3 -- |
4 -- Module      :  Data.Maybe
5 -- Copyright   :  (c) The University of Glasgow 2001
6 -- License     :  BSD-style (see the file libraries/base/LICENSE)
7 -- 
8 -- Maintainer  :  libraries@haskell.org
9 -- Stability   :  experimental
10 -- Portability :  portable
11 --
12 -- The Maybe type, and associated operations.
13 --
14 -----------------------------------------------------------------------------
15
16 module Data.Maybe
17    (
18      Maybe(Nothing,Just)-- instance of: Eq, Ord, Show, Read,
19                         --              Functor, Monad, MonadPlus
20
21    , maybe              -- :: b -> (a -> b) -> Maybe a -> b
22
23    , isJust             -- :: Maybe a -> Bool
24    , isNothing          -- :: Maybe a -> Bool
25    , fromJust           -- :: Maybe a -> a
26    , fromMaybe          -- :: a -> Maybe a -> a
27    , listToMaybe        -- :: [a] -> Maybe a
28    , maybeToList        -- :: Maybe a -> [a]
29    , catMaybes          -- :: [Maybe a] -> [a]
30    , mapMaybe           -- :: (a -> Maybe b) -> [a] -> [b]
31    ) where
32
33 #ifdef __GLASGOW_HASKELL__
34 import {-# SOURCE #-} GHC.Err ( error )
35 import GHC.Base
36 #endif
37
38 -- ---------------------------------------------------------------------------
39 -- The Maybe type, and instances
40
41 data  Maybe a  =  Nothing | Just a      deriving (Eq, Ord)
42
43 instance  Functor Maybe  where
44     fmap _ Nothing       = Nothing
45     fmap f (Just a)      = Just (f a)
46
47 instance  Monad Maybe  where
48     (Just x) >>= k      = k x
49     Nothing  >>= _      = Nothing
50
51     (Just _) >>  k      = k
52     Nothing  >>  _      = Nothing
53
54     return              = Just
55     fail _              = Nothing
56
57 -- ---------------------------------------------------------------------------
58 -- Functions over Maybe
59
60 maybe :: b -> (a -> b) -> Maybe a -> b
61 maybe n _ Nothing  = n
62 maybe _ f (Just x) = f x
63
64 isJust         :: Maybe a -> Bool
65 isJust Nothing = False
66 isJust _       = True
67
68 isNothing         :: Maybe a -> Bool
69 isNothing Nothing = True
70 isNothing _       = False
71
72 fromJust          :: Maybe a -> a
73 fromJust Nothing  = error "Maybe.fromJust: Nothing" -- yuck
74 fromJust (Just x) = x
75
76 fromMaybe     :: a -> Maybe a -> a
77 fromMaybe d x = case x of {Nothing -> d;Just v  -> v}
78
79 maybeToList            :: Maybe a -> [a]
80 maybeToList  Nothing   = []
81 maybeToList  (Just x)  = [x]
82
83 listToMaybe           :: [a] -> Maybe a
84 listToMaybe []        =  Nothing
85 listToMaybe (a:_)     =  Just a
86  
87 catMaybes              :: [Maybe a] -> [a]
88 catMaybes ls = [x | Just x <- ls]
89
90 mapMaybe          :: (a -> Maybe b) -> [a] -> [b]
91 mapMaybe _ []     = []
92 mapMaybe f (x:xs) =
93  let rs = mapMaybe f xs in
94  case f x of
95   Nothing -> rs
96   Just r  -> r:rs
97