diff --git a/Control/Monad/Extra.hs b/Control/Monad/Extra.hs
--- a/Control/Monad/Extra.hs
+++ b/Control/Monad/Extra.hs
@@ -11,10 +11,11 @@
 import Control.Monad.Base
 import Control.Monad.IO.Class
 import Control.Monad.Morph
+import Control.Monad.STM
 import Control.Monad.Trans.Cont
 import Control.Monad.Trans.Control
-import Control.Monad.STM
 import Data.IORef
+import Data.Maybe (catMaybes)
 
 -- | Synonym for @return ()@.
 skip :: Monad m => m ()
@@ -77,6 +78,10 @@
 liftMaybe :: MonadPlus m => Maybe a -> m a
 liftMaybe = maybe mzero return
 
+-- | A monadic version of @mapMaybe :: (a -> Maybe b) -> [a] -> [b]@.
+mapMaybeM :: (Monad m, Functor m) => (a -> m (Maybe b)) -> [a] -> m [b]
+mapMaybeM f xs = catMaybes <$> mapM f xs
+
 -- | A transformer-friendly version of 'atomically'.
 atomicallyM :: MonadIO m => STM a -> m a
 atomicallyM = liftIO . atomically
@@ -194,6 +199,20 @@
         else do
             as <- sequenceUntil p ms
             return (a:as)
+
+-- | Draw monadic actions from a list until one of them yields a value
+--   failing the predicate, and then return all the passing values
+--   (discarding the final, failing value) in a list within that
+--   monad.
+sequenceWhile :: Monad m => (a -> Bool) -> [m a] -> m [a]
+sequenceWhile _ [] = return []
+sequenceWhile p (m:ms) = do
+    a <- m
+    if p a
+        then do
+            as <- sequenceWhile p ms
+            return (a:as)
+        else return []
 
 -- | A type wrapper for composing monad transformers.  This is very similar to
 --   'Data.Functor.Compose', just one level up.
diff --git a/monad-extras.cabal b/monad-extras.cabal
--- a/monad-extras.cabal
+++ b/monad-extras.cabal
@@ -1,5 +1,5 @@
 name:           monad-extras
-version:        0.5.3
+version:        0.5.4
 synopsis:       Extra utility functions for working with monads
 -- description:
 homepage:       http://github.com/jwiegley/monad-extras
