-- | Extra utilities for monads.

module Control.Monad.Extra where

import Data.Maybe

-- | Ignore the given action's return.
ig :: (Monad m) => m a -> m ()
ig m = m >> return ()

-- | A non-operator version of (=<<).
bind :: (Monad m) => (a -> m b) -> m a -> m b
bind = flip (>>=)

-- | When the value is Just, run the action.
whenJust :: Monad m => Maybe a -> (a -> m ()) -> m ()
whenJust (Just a) m = m a
whenJust Nothing  _ = return ()

-- | Wrap up a functor in a Maybe.
just :: Functor m => m a -> m (Maybe a)
just = fmap Just

-- | Flip 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