-- | Monadic combinators missing from the standard library
module Control.Monad.TM
(
  (.>>=.)
, (.=<<.)
) where

import Data.Traversable
import Control.Monad hiding (mapM)
import Prelude hiding (mapM)

-- | Lifting bind into a monad. Often denoted /concatMapM/.
(.>>=.) ::
  (Monad q, Monad m, Traversable m) =>
  (a -> q (m b))
  -> m a
  -> q (m b)
(.>>=.) f =
  liftM join . mapM f

-- | Lifting bind into a monad. Often denoted /concatMapM/.
(.=<<.) ::
  (Monad q, Monad m, Traversable m) =>
  m a
  -> (a -> q (m b))
  -> q (m b)
(.=<<.) =
  flip (.>>=.)