monadplus-1.4.2: Haskell98 partial maps and filters over MonadPlus.

Copyright(c) Hans Hoglund 2012
LicenseBSD-style
Maintainerhans@hanshoglund.se
Stabilityexperimental
Portabilitynon-portable (TF,GNTD)
Safe HaskellNone
LanguageHaskell98

Control.Monad.Plus

Contents

Description

Partial maps and filters over MonadPlus instances. The basic idea here is that the monad interface together with the monoidal structure of MonadPlus is enough to implement partial maps and filters (i.e. mmapMaybe and mfilter).

This is especially useful for sequential structures such as event lists, tracks etc.

Inspired by the following blog post:

Synopsis

Basics

msum :: (Foldable t, MonadPlus m) => t (m a) -> m a #

The sum of a collection of actions, generalizing concat. As of base 4.8.0.0, msum is just asum, specialized to MonadPlus.

msum' :: (MonadPlus m, Foldable t) => t (m a) -> m a Source #

This generalizes the list-based concat function.

Constructing

mfold :: (MonadPlus m, Foldable t) => t a -> m a Source #

Fold a value into an arbitrary MonadPlus type.

This function generalizes the toList function.

mfromList :: MonadPlus m => [a] -> m a Source #

Translate a list to an arbitrary MonadPlus type.

This function generalizes the listToMaybe function.

mfromMaybe :: MonadPlus m => Maybe a -> m a Source #

Translate maybe to an arbitrary MonadPlus type.

This function generalizes the maybeToList function.

mreturn :: MonadPlus m => (a -> Maybe b) -> a -> m b Source #

Convert a partial function to a function returning an arbitrary MonadPlus type.

Filtering

mpartition :: MonadPlus m => (a -> Bool) -> m a -> (m a, m a) Source #

The partition function takes a predicate a list and returns the pair of lists of elements which do and do not satisfy the predicate, respectively; i.e.,

partition p xs == (filter p xs, filter (not . p) xs)

This function generalizes the partition function.

Special filters

mscatter :: MonadPlus m => m [b] -> m b Source #

Join list elements together.

This function generalizes the catMaybes function.

mscatter' :: (MonadPlus m, Foldable t) => m (t b) -> m b Source #

Join foldable elements together.

This function generalizes the catMaybes function.

mcatMaybes :: MonadPlus m => m (Maybe a) -> m a Source #

Pass through Just elements.

This function generalizes the catMaybes function.

mlefts :: MonadPlus m => m (Either a b) -> m a Source #

Pass through Left elements.

This function generalizes the lefts function.

mrights :: MonadPlus m => m (Either a b) -> m b Source #

Pass through Right elements.

This function generalizes the rights function.

mpartitionEithers :: MonadPlus m => m (Either a b) -> (m a, m b) Source #

Separate Left and Right elements.

This function generalizes the partitionEithers function.

Special maps

mmapMaybe :: MonadPlus m => (a -> Maybe b) -> m a -> m b Source #

Modify or discard a value.

This function generalizes the mapMaybe function.

mconcatMap :: MonadPlus m => (a -> [b]) -> m a -> m b Source #

Modify, discard or spawn values.

This function generalizes the concatMap function.

mconcatMap' :: (MonadPlus m, Foldable t) => (a -> t b) -> m a -> m b Source #

Modify, discard or spawn values.

This function generalizes the concatMap function.

Utility

newtype Partial a b Source #

Wrapper for partial functions with MonadPlus instance.

Constructors

Partial 

Fields

Instances

Monad (Partial r) Source # 

Methods

(>>=) :: Partial r a -> (a -> Partial r b) -> Partial r b #

(>>) :: Partial r a -> Partial r b -> Partial r b #

return :: a -> Partial r a #

fail :: String -> Partial r a #

Functor (Partial r) Source # 

Methods

fmap :: (a -> b) -> Partial r a -> Partial r b #

(<$) :: a -> Partial r b -> Partial r a #

Applicative (Partial r) Source # 

Methods

pure :: a -> Partial r a #

(<*>) :: Partial r (a -> b) -> Partial r a -> Partial r b #

liftA2 :: (a -> b -> c) -> Partial r a -> Partial r b -> Partial r c #

(*>) :: Partial r a -> Partial r b -> Partial r b #

(<*) :: Partial r a -> Partial r b -> Partial r a #

Alternative (Partial r) Source # 

Methods

empty :: Partial r a #

(<|>) :: Partial r a -> Partial r a -> Partial r a #

some :: Partial r a -> Partial r [a] #

many :: Partial r a -> Partial r [a] #

MonadPlus (Partial r) Source # 

Methods

mzero :: Partial r a #

mplus :: Partial r a -> Partial r a -> Partial r a #

Monoid (Partial a b) Source # 

Methods

mempty :: Partial a b #

mappend :: Partial a b -> Partial a b -> Partial a b #

mconcat :: [Partial a b] -> Partial a b #

partial :: (a -> Bool) -> a -> Maybe a Source #

Convert a predicate to a partial function.

predicate :: (a -> Maybe a) -> a -> Bool Source #

Convert a partial function to a predicate.

always :: (a -> b) -> a -> Maybe b Source #

Convert a total function to a partial function.

never :: a -> Maybe c Source #

Make a partial function that always rejects its input.