-- | Extra monadic functions.
module Control.Monad.Extra where
import Control.Monad
import Data.Maybe
-- | Word version of flip (>>=).
bind :: (Monad m) => (a -> m b) -> m a -> m b
bind = flip (>>=)
-- | When the value is Just.
whenJust :: Monad m => Maybe a -> (a -> m ()) -> m ()
whenJust (Just a) m = m a
whenJust Nothing _ = return ()
-- | Wrap up a form in a Maybe.
just :: Functor m => m a -> m (Maybe a)
just = fmap Just
-- | Flip of mapMaybe.
forMaybe :: [a] -> (a -> Maybe b) -> [b]
forMaybe = flip mapMaybe
-- | Monadic version of maybe.
maybeM :: (Monad m) => a -> (a1 -> m a) -> Maybe a1 -> m a
maybeM nil cons a = maybe (return nil) cons a
-- | Do any of the (monadic) predicates match?
anyM :: Monad m => (a -> m Bool) -> [a] -> m Bool
anyM p l = return . not . null =<< filterM p l