{-# LANGUAGE PackageImports #-}
{-# LANGUAGE Safe           #-}

module Data.Maybe (
   -- * The @Maybe@ type and operations

     Maybe(Nothing,Just)-- instance of: Eq, Ord, Show, Read,
                        --              Functor, Monad, MonadPlus

   , maybe              -- :: b -> (a -> b) -> Maybe a -> b

   , isJust             -- :: Maybe a -> Bool
   , isNothing          -- :: Maybe a -> Bool
   , fromJust           -- :: Maybe a -> a
   , fromMaybe          -- :: a -> Maybe a -> a
   , listToMaybe        -- :: [a] -> Maybe a
   , maybeToList        -- :: Maybe a -> [a]
   , catMaybes          -- :: [Maybe a] -> [a]
   , mapMaybe           -- :: (a -> Maybe b) -> [a] -> [b]

   -- * Specification

   -- $code

  ) where
import           "base" Data.Maybe

{- $code
> module Data.Maybe(
>     Maybe(Nothing, Just),
>     isJust, isNothing,
>     fromJust, fromMaybe, listToMaybe, maybeToList,
>     catMaybes, mapMaybe,
>     maybe
>   ) where
>
> maybe                  :: b -> (a -> b) -> Maybe a -> b
> maybe n _ Nothing      =  n
> maybe _ f (Just x)     =  f x
>
> isJust                 :: Maybe a -> Bool
> isJust (Just a)        =  True
> isJust Nothing         =  False
>
> isNothing              :: Maybe a -> Bool
> isNothing              =  not . isJust
>
> fromJust               :: Maybe a -> a
> fromJust (Just a)      =  a
> fromJust Nothing       =  error "Maybe.fromJust: Nothing"
>
> fromMaybe              :: a -> Maybe a -> a
> fromMaybe d Nothing    =  d
> fromMaybe d (Just a)   =  a
>
> maybeToList            :: Maybe a -> [a]
> maybeToList Nothing    =  []
> maybeToList (Just a)   =  [a]
>
> listToMaybe            :: [a] -> Maybe a
> listToMaybe []         =  Nothing
> listToMaybe (a:_)      =  Just a
>
> catMaybes              :: [Maybe a] -> [a]
> catMaybes ms           =  [ m | Just m <- ms ]
>
> mapMaybe               :: (a -> Maybe b) -> [a] -> [b]
> mapMaybe f             =  catMaybes . map f
-}