module Maybe(
the, exists, theExists, maybe, fromMaybe, listToMaybe, maybeToList,
findMaybe, catMaybes, mapMaybe, joinMaybe, unfoldr ) where
exists :: Maybe a -> Bool
the :: Maybe a -> a
theExists :: Maybe a -> (a, Bool)
fromMaybe :: a -> Maybe a -> a
listToMaybe :: [a] -> Maybe a
maybeToList :: Maybe a -> [a]
findMaybe :: (a -> Bool) -> [a] -> Maybe a
catMaybes :: [Maybe a] -> [a]
mapMaybe :: (a -> Maybe b) -> [a] -> [b]
joinMaybe :: (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a
unfoldr :: (a -> Maybe (b, a)) -> a -> ([b],a)
|
These utilities are self-documenting. Other operations on Maybe are part of the monadic classes in the Prelude.
module Maybe(
the, exists, theExists, maybe, fromMaybe, listToMaybe, maybeToList,
findMaybe, catMaybes, mapMaybe, joinMaybe, unfoldr ) where
exists :: Maybe a -> Bool exists = maybe False (const True)
the :: Maybe a -> a the = maybe (error "Maybe.the: Nothing") id
theExists :: Maybe a -> (a, Bool) theExists = maybe (error "Maybe.theExists: Nothing", False) (a, True)
fromMaybe :: a -> Maybe a -> a fromMaybe d = maybe d id
maybeToList :: Maybe a -> [a] maybeToList = maybe [] (\ x -> [x])
listToMaybe :: [a] -> Maybe a listToMaybe [] = Nothing listToMaybe (a:as) = Just a
findMaybe :: (a -> Bool) -> [a] -> Maybe a findMaybe p = listToMaybe . filter p
catMaybes :: [Maybe a] -> [a] catMaybes [] = [] catMaybes (Nothing:xs) = catMaybes xs catMaybes (Just x:xs) = x : catMaybes xs
mapMaybe :: (a -> Maybe b) -> [a] -> [b] mapMaybe f = catMaybes . map f
joinMaybe :: (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a joinMaybe _ Nothing Nothing = Nothing joinMaybe _ (Just g) Nothing = Just g joinMaybe _ Nothing (Just g) = Just g joinMaybe f (Just g) (Just h) = Just (f g h)
-- unfoldr f' (foldr f z xs) == (xs,z) -- -- if the following holds: -- -- f' (f x y) = Just (x,y) -- f' z = Nothing unfoldr :: (a -> Maybe (b, a)) -> a -> ([b],a) unfoldr f x = case f x of Just (y,x') -> let (ys,x'') = unfoldr f x' in (y:ys,x'') Nothing -> ([],x)